ライブラリのeachSeriesを使用して、非同期関数の配列を同期的に実行しようとしていasync
ます。
このSO投稿によると、彼らは言う
async.eachSeriesとの違いは、各反復が非同期操作の完了を待ってから次の操作を開始することです。
これが私が欲しいものです。
質問:返される内部の約束が解決された後にのみeachSeries
、次を呼び出すために使用する方法を完全に理解していません。async
setTimeout
next()
2つの非同期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);
});
問題は、を呼び出すとgetNextDialogTimer
、timeout
すぐに開始/設定することです。これが関数の最初の行です。それらはキューに追加されるとすぐに開始されますが、これはあなたが望むものではありません。
代わりに、呼び出し可能な関数をキューに入れることができます。これにより、呼び出されたときにタイムアウトが開始されます。または、dialog, ms
アイテムをキューに入れることもできます。これはおそらく理解しやすいでしょう。例:
const dialogTimerQueue = [];
const data = 'foo';
const data2 = 'bar';
const npcDialogDelay = 1;
const next = () => new Promise(resolve =>
setTimeout(() => {
console.log('next resolved');
resolve();
}, 500)
);
dialogTimerQueue.push({ dialog: data, ms: 1000 });
dialogTimerQueue.push({ dialog: data2, ms: 1000 });
async.eachSeries(dialogTimerQueue, ({ dialog, ms }, cb) => {
setTimeout(() => {
console.log('resolving ' + dialog);
next().then(cb);
}, npcDialogDelay * ms);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/async/2.6.1/async.min.js"></script>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加