刚从 thunk 转到 sagas,我正在尝试找到最佳方法来调用 setTimeout 并从该函数内部调用另一个函数(在本例中为 corewar.step())。这是我的原始代码,它按照我预期的方式工作。
runner = window.setInterval(() => {
for(let i = 0; i < processRate; i++) {
corewar.step()
}
operations += processRate;
}, 1000/60)
这段代码在一个中,我相信我应该能够像在应用程序的其他区域一样,在中包装函数调用。
我尝试将setInterval
调用包装在中,并将其他内容保持不变,结果导致step()
从未被调用。
runner = yield call(window.setInterval, () => {
for(let i = 0; i < processRate; i++) {
corewar.step()
}
operations += processRate;
}, 1000/60)
我尝试过将setInterval
保留原样,并通过调用包装step()
函数,同时更改匿名函数签名为function*
,但这也导致step()
从未被调用。
runner = window.setInterval(function*() {
for(let i = 0; i < processRate; i++) {
yield call([corewar, corewar.step])
}
operations += processRate;
}, 1000/60)
最后,我已经尝试将两者包装起来,但再次导致step()
从未被调用。
runner = yield call(window.setInterval, function*() {
for(let i = 0; i < processRate; i++) {
yield call([corewar, corewar.step])
}
operations += processRate;
}, 1000/60)
感觉好像哪里不对,所以我的问题是:我是否需要完全将这些函数封装在call
中,还是这样做是错误的?
接下来的问题是,如果我应该将外部的setInterval
包裹在call
中,那么我应该如何定义一个作为call
参数的函数,该函数也希望返回一个put
或者call
呢?