Javascript 如何在没有中断语句的情况下结束while(true)循环?
我正在浏览redux传奇频道的文档。在这里我遇到了代码:Javascript 如何在没有中断语句的情况下结束while(true)循环?,javascript,redux,redux-saga,Javascript,Redux,Redux Saga,我正在浏览redux传奇频道的文档。在这里我遇到了代码: export function* saga() { const chan = yield call(countdown, value) try { while (true) { let seconds = yield take(chan) console.log(`countdown: ${seconds}`) } } finally { if (yield cancel
export function* saga() {
const chan = yield call(countdown, value)
try {
while (true) {
let seconds = yield take(chan)
console.log(`countdown: ${seconds}`)
}
} finally {
if (yield cancelled()) {
chan.close()
console.log('countdown cancelled')
}
}
}
正如您所看到的,这是一个永远不会结束的无限循环,您应该调用break或throw和exception。但在上面的例子中,没有一个是这样的。在上面的代码中或调用函数中没有引发中断或异常。上面的无限循环如何结束并到达finally块
请参阅:在某些调用中,这一行似乎抛出异常
yield take(chan)
屈服于它自身的返回值,所以根本没有无限循环
更新:关于收益率如何工作的更多细节可以在这里找到上述示例将打破循环,因为redux saga的竞争可以在引用的示例中找到 示例中有一个组件,单击该组件时会分派CANCEL\u INCREMENT\u ASYC操作。这部传奇故事捕捉到了这一行动和世界的火焰 由于incrementAsync函数在while循环上运行(本质上与上面发布的函数相同),take(CANCEL\u INCREMENT\u ASYNC)首先解析。竞赛中的losing函数(上面发布的函数)得到一个抛出的错误,该错误将把传奇故事恢复到
finally
块中
这是一个可能导致取消的操作。如果您查看
倒计时
函数中的内容,您将看到如果秒不大于0,将发出一个特殊的结束
操作
从'redux saga'导入{eventChannel,END}
函数倒计时(秒){
返回事件通道(发射器=>{
常数iv=设置间隔(()=>{
秒-=1
如果(秒>0){
发射器(秒)
}否则{
//这会导致通道关闭
发射器(结束)
净空间隔(四)
}
}, 1000);
//订阅者必须返回取消订阅功能
return()=>{
净空间隔(四)
}
}
)
}
(上面的代码段来自:)
END
操作在take(pattern)
的文档中提到:
为什么说不会引发异常?(我猜会抛出异常。)您不想知道yield
是做什么的,还是函数之后的*
?“在…调用函数中没有…抛出异常”-在被调用函数中呢?take()
做什么?我知道发电机是如何工作的。我已经浏览了源代码,没有发现任何异常被优雅地处理。@mahadazad您是否尝试添加catch
块以查看抛出了什么异常?这可能会更容易在源代码中找到。我知道生成器是如何工作的。我认为runSaga能够优雅地处理异常,这样我们就不需要在上面的代码中处理异常,最终也会被调用。但是我在源代码中没有看到这样的代码。