2015-12-04 7 views
0

Как я могу присвоить значение глобальной переменной от async.waterfall, которая находится внутри setTimeout?Назначить глобальную переменную из async.waterfall

Вот часть моего кода:

var theVar = null; 

setTimeout(function() { 
async.waterfall([ 
     function (next) { 
     var thedata = 1; 
     next(null,thedata); 
     }, 
     function (thedata,next) { 
     if (thedata === 1) { 
      theVar = 2; 
     } 
     theVar = 3; 
     next(); 
], function (err, result) { 

}); 
}, theVar * 1000); //theVar is timeout here. 

Так, в принципе, я хочу, чтобы установить глобальную переменную внутри async.waterfall. Эта переменная theVar будет таймаутом в setTimeout. Сейчас theVar всегда null.

ответ

0

Вы не можете.

Оставляя в стороне обычные вопросы о returning from an asynchronous call ...

Вы пытаетесь сделать некоторые довольно серьезные путешествия во времени здесь.

Через X секунд вы начнете асинхронную функцию. В какой-то момент после этого вы получите от этого ценность. Только тогда вы узнаете, что должен быть X.

Это невозможно (из-за ограничений причинности вообще, а не программирования).


Что бы можно было бы:

  1. магазин текущее время
  2. Начало асинхронной функции
  3. Когда вы получили результат от этой функции, использовать его, чтобы определить интервал
  4. Вычесть разницу между «сейчас» и сохраненным временем с интервала
  5. Установить тайм-аут что-то еще с помощью этого вычисленного времени

Конечно, так как вы не можете предсказать время между шагами 2 и 3, то возможно, что значение, которое вы получите в шаге 4 будет отрицательным (т.е. что время, которое вы хотели бы запустить функцию, прошло бы, пока вы ждали завершения вычисления асинхронизации).

+0

ОК спасибо за подробный ответ. – user1665355

+0

Но можно ли обернуть setTimeout в другой setTimeout? Где wrapped setTimeout присваивает 'theVar' внешнему setTimeout? – user1665355

+0

@ user1665355 - Нет, по той же причине. – Quentin

Смежные вопросы