Javascript 如何在没有中断语句的情况下结束while(true)循环?

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

我正在浏览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 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能够优雅地处理异常,这样我们就不需要在上面的代码中处理异常,最终也会被调用。但是我在源代码中没有看到这样的代码。