約束を返すことで複数のsetTimeoutsを順番に呼び出す

グローラー

ライブラリのeachSeries使用して、非同期関数の配列を同期的に実行しようとしていasyncます。

このSO投稿によると、彼らは言う

async.eachSeriesとの違いは、各反復が非同期操作の完了を待ってから次の操作を開始することです。

これが私が欲しいものです。

質問:返される内部の約束が解決された後にのみeachSeries、次を呼び出すために使用する方法を完全に理解していませんasync setTimeoutnext()

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が並行して実行されることです。彼らは次々に走る必要があります。

getNextDialogTimersetTimeoutそれ自体が約束を返す新しいを返します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);
    });
特定のパフォーマンス

問題は、を呼び出すとgetNextDialogTimertimeoutすぐに開始/設定することです。これが関数の最初の行です。それらはキューに追加されるとすぐに開始されますが、これはあなたが望むものではありません。

代わりに、呼び出し可能な関数をキューに入れることができます。これにより、呼び出されたときにタイムアウトが開始されます。または、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]

編集
0

コメントを追加

0

関連記事

分類Dev

順番に値を返さないことを約束する

分類Dev

複数のsetTimeout()を順番に呼び出すjQuery

分類Dev

Angular $ qが複数の$ http呼び出しを約束する

分類Dev

条件付きで、別の約束で約束を呼び出す

分類Dev

約束を返す関数を呼び出すと、よりクリーンになります

分類Dev

メソッドを順番に呼び出すことはできますか?

分類Dev

React Redux:複数の依存アクションを順番に呼び出す方法

分類Dev

なぜ私が直接setTimeout関数に約束のための決意を()を呼び出すことはできません

分類Dev

これらの約束を順番に実行する方法

分類Dev

進行中の非同期呼び出しの約束を返す

分類Dev

約束を返す複数の関数

分類Dev

チェーンですぐに呼び出されることを約束しますか?

分類Dev

配列内で関数のセットを順番に呼び出す

分類Dev

2つのjQueryajax呼び出しを順番に起動することができません

分類Dev

複数の約束を生み出す

分類Dev

Angular-複数のHTTP呼び出しを順番に行う

分類Dev

Angular-複数のHTTP呼び出しを順番に行う

分類Dev

未定義の変数を返すことを約束します

分類Dev

2つのAPI呼び出しではなく4つのAPI呼び出しをすべて行うことを約束する

分類Dev

関数呼び出しを返すことと、再帰中に関数を再度呼び出すことだけの違いは何ですか?

分類Dev

同期関数のみを呼び出すときにjavascriptが非同期を約束するのはなぜですか?

分類Dev

約束を順番に解決する

分類Dev

約束を順番に実行する

分類Dev

関数から値を返し、新しい結果で各行に順番に呼び出す方法

分類Dev

Angularで同じ約束を複数の呼び出しで待機させる

分類Dev

JavaScriptは順番に起動しないことを約束します

分類Dev

reduxsagasを順番に呼び出す

分類Dev

約束を返すことと約束の中で未定義を返すことの違い

分類Dev

AngularJSで関数を呼び出すことへの応答を返す方法は?

Related 関連記事

  1. 1

    順番に値を返さないことを約束する

  2. 2

    複数のsetTimeout()を順番に呼び出すjQuery

  3. 3

    Angular $ qが複数の$ http呼び出しを約束する

  4. 4

    条件付きで、別の約束で約束を呼び出す

  5. 5

    約束を返す関数を呼び出すと、よりクリーンになります

  6. 6

    メソッドを順番に呼び出すことはできますか?

  7. 7

    React Redux:複数の依存アクションを順番に呼び出す方法

  8. 8

    なぜ私が直接setTimeout関数に約束のための決意を()を呼び出すことはできません

  9. 9

    これらの約束を順番に実行する方法

  10. 10

    進行中の非同期呼び出しの約束を返す

  11. 11

    約束を返す複数の関数

  12. 12

    チェーンですぐに呼び出されることを約束しますか?

  13. 13

    配列内で関数のセットを順番に呼び出す

  14. 14

    2つのjQueryajax呼び出しを順番に起動することができません

  15. 15

    複数の約束を生み出す

  16. 16

    Angular-複数のHTTP呼び出しを順番に行う

  17. 17

    Angular-複数のHTTP呼び出しを順番に行う

  18. 18

    未定義の変数を返すことを約束します

  19. 19

    2つのAPI呼び出しではなく4つのAPI呼び出しをすべて行うことを約束する

  20. 20

    関数呼び出しを返すことと、再帰中に関数を再度呼び出すことだけの違いは何ですか?

  21. 21

    同期関数のみを呼び出すときにjavascriptが非同期を約束するのはなぜですか?

  22. 22

    約束を順番に解決する

  23. 23

    約束を順番に実行する

  24. 24

    関数から値を返し、新しい結果で各行に順番に呼び出す方法

  25. 25

    Angularで同じ約束を複数の呼び出しで待機させる

  26. 26

    JavaScriptは順番に起動しないことを約束します

  27. 27

    reduxsagasを順番に呼び出す

  28. 28

    約束を返すことと約束の中で未定義を返すことの違い

  29. 29

    AngularJSで関数を呼び出すことへの応答を返す方法は?

ホットタグ

アーカイブ