0

プリエンプティブ マルチタスキングはブラウザーでは利用できず、JavaScript は本質的にシングル スレッドであるため、redux-saga のような Redux ミドルウェアは、長時間実行されるスクリプト ダイアログをトリガーすることなく、共同マルチタスク用に設計されていない無限ループをどのように処理しますか?

function* watchSaga() {
    while (true) {
        yield take(SOME_REQUEST);
        // do something 
    }
}

編集

「協調的なマルチタスク用に設計されていない」という私の発言は間違っていました。ジェネレーター関数のコードは、最初のyield式までしか実行されません。

4

2 に答える 2

2

これは無限ループではなく、ジェネレータhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generatorsです。

yield キーワードは関数を終了しますが、最後に実行された行を含むその状態は、関数が次に呼び出されるまで、最後に実行された行の次のステートメントから再開され、yield キーワードが再び表示されるまで残ります。

于 2017-01-04T04:45:50.357 に答える
1

yield制御を生成し、現在のジェネレーター関数を一時停止し、それに値を返すので、実際にキーです。

簡単な例:

function* counter() {
  console.log('Running generator to first yield point');
  var x = 0;
  do {
    console.log('About to increment and yield control');
    yield ++x;
    console.log('Running counter to next yield point - x is currently', x);
  } while (true);
}

console.log('Instantiating generator');
var instance = counter();
console.log('Generator instantiated, calling for the first time');
console.log('The first entry in counter is', instance.next());
console.log('The second entry in counter is', instance.next());
console.log('The third entry in counter is', instance.next());
console.log('The program continues running');

于 2017-01-04T04:45:03.710 に答える