Я пытаюсь синхронно запустить массив асинхронных функций, используя eachSeries из async
библиотеки.
Согласно этой SO Post , они говорят
Разница с async.eachSeries заключается в том, что каждая итерация будет ожидать завершения асинхронной операции перед началом следующей.
Это то, что я хочу.
Вопрос: Я не совсем понимаю, как использовать eachSeries
для вызова следующего async
setTimeout
только после возвращения внутреннего обещания next()
разрешается.
Я помещаю две асинхронные setTimeout
функции в свою очередь:
this.dialogTimerQueue.push(this.getNextDialogTimer(data, 1000));
this.dialogTimerQueue.push(this.getNextDialogTimer(data2, 1000));
console.log(this.dialogTimerQueue); // [101, 102]
Затем пытаюсь выполнить итерацию:
// https://caolan.github.io/async/docs.html#eachSeries
async.eachSeries(this.dialogTimerQueue, (result) => {
});
Проблема в , оба setTimeout
работают параллельно.Они должны запускаться один за другим.
getNextDialogTimer
возвращает новое setTimeout
, которое само возвращает обещание next()
getNextDialogTimer: function(dialog, ms) {
let foo = setTimeout(() => {
// only when next() completes, call next in async series
return this.next(dialog);
}, this.npcDialogDelay * ms);
console.log('Timeout: ', foo); // 101 or 102
return foo;
},
next()
обещание:
// Return promise
next: function(dialog) {
var promiseTest = this.screenObj.conversation().addDialogToCenterScreen('npc', dialog, '');
console.log('Next: ', promiseTest);
return promiseTest;
},
Console.log отображается как:
async.eachSeries(this.dialogTimerQueue, ({dialog, ms}, cb) => {
setTimeout(() => {
console.log('RESOLVING ' + dialog);
this.next(dialog).then(() => {
cb();
});
}, this.npcDialogDelay * ms);
});