Говоря JavaScript, чтобы остановить выполнение кода и делать фоновые вещи в середине функции - PullRequest
4 голосов
/ 28 мая 2011

Извините за заголовок, но не смог придумать ничего по-настоящему информативного и лаконичного.

Моя ситуация такова, что я запускаю setTimeout и хочу, чтобы он мог выполняться в середине функции JS(он используется для решения проблемы с внедрением функций GM в веб-страницу).

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

В трех тестах rValue по-прежнему не определено (что имеет смысл, поскольку JS является однопоточным по большей части).

Итак, у меня есть 2 решения, о которых я подумал.

Избранное: Есть ли способ сказать JS о том, чтобы он спал в середине функции и работал над второстепенными вещами (такими как Timeouts)?

Другое: Кто-нибудь знает, когда будет вызван этот тайм-аут?Может быть, после выполнения этой функции, но перед тем, как она будет вызвана, она снова запускается?В этом случае решение rValue global решило бы проблему (но немного усложнило кодирование).

Или будет ждать, пока все JS не будут выполнены?В этом случае мне, возможно, понадобится другой метод setTimeout для обработки результата.

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Нет никакого способа, которым вы просите, могут быть выполнены.Пока HTML5 не является широко распространенным стандартом, вы не можете делать то, что просите, не думая асинхронно.

Например:

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

и вызывать это с помощью обратного вызова:

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

Для последнего sippet "foo" будет отображаться до rValue, потому что testG будет выполнять функцию тайм-аута только тогда, когда доступен поток Javascript, или только когда не запущен другой скрипт.

2 голосов
/ 28 мая 2011

Чтобы ответить на ваш первый вопрос, в JS нет функции «сна». На самом деле, есть сайт, посвященный попыткам его создания: http://www.devcheater.com/ Вывод: вы не можете.

Если вы хотите, чтобы остальная часть кода была запущена позже, вы можете поместить этот код в функцию и setTimeout ().

Конечно, обычный способ обработки сценария, который вы создали, - это обратные вызовы. Так как вы в основном ждете, чтобы что-то в setTimeout произошло, вы можете заставить его вызывать остальную часть вашего кода, когда это будет сделано. Например:

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