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 回答