开发者

Telling javascript to stop executing code and do background stuff in the middle of a function

Sorry about the title but could not come up with anything really informative and conci开发者_C百科se.

My situation is that I am launching a setTimeout and I want it to be able to run in the middle of a JS function (it is used to get around the issue with injecting GM functions into the web page).

unsafeWindow.testG = function(key, dValue){
var rValue;
setTimeout(function(){rValue = GM_getValue(key, dValue);}, 0);
alert(rValue);
alert(rValue);
return(rValue);
}

In the three tests rValue is still undefined (which makes sense because JS is single threaded for the most part).

So I have 2 solutions I have thought of.

Favourite: Is there anyway to tell JS to sleep in the middle of a function and work on background stuff (like Timeouts)?

Other: Does anyone know when this timeout will be called? Maybe after this function execution but before whatever called it starts up again? In that case making rValue global would solve the issue (but make slightly messier coding).

Or will it wait until all JS is done executing? In that case I would possibly need another setTimeout to process the result.


There is no way what you're asking for can be accompished. Until HTML5 is a wide spread standard, you can't do what you're asking without thinking asynchronously.

For example :

unsafeWindow.testG = function(key, dValue, callback){
   var rValue;
   setTimeout(function(){
      rValue = GM_getValue(key, dValue);
      callback(rValue);
   }, 0);
}

and call this with a callback :

unsafewindow.testG(key, dValue, function(rValue) {
   alert(rValue);
});
alert("foo");

For the last sippet, "foo" will be echoed before rValue, because testG will execute the timeout function only when the Javascript thread is available, or only when there's no other script running.


To answer your first question, there is no 'sleep' function in JS. In fact, there is a site devoted to trying to create one: http://www.devcheater.com/ The conclusion: you cannot.

If what you'd like to do is make the rest of your code run later, you can put that code in a function and setTimeout().

Of course, the usual way to handle the sort of scenario you have set up is with callbacks. Since you're basically waiting for the thing in setTimeout to happen, you can have it call the rest of your code whenever it's done. For example:

var fartResult
function waitAMinuteThenFart (callback) {
  function fart () {
    fartResult = 'fart'
    callback(fartResult)
  }
  setTimeout(fart, 1000*60)
}
waitAMinuteThenFart(function (result) { alert(result) })
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜