【问题标题】:How to *reopen* AsyncIterator after broke a "for await" loop?打破“等待”循环后如何*重新打开* AsyncIterator?
【发布时间】:2019-08-12 02:03:14
【问题描述】:

在第一个for await之后的函数testMultipleLoops2中, l 将转向GeneratorStatus:<closed>, 我进行了大量研究,但没有找到重新打开它的方法。

const tryRecursive=async function*(i=0){console.count("tryRecursive");yield i++;yield*tryRecursive(i)}
const asyncDelay=(b,delay=1e3)=>new Promise((resolve,reject)=>setTimeout(()=>resolve(b()),delay))
const tryDelayYieldNumbers=async function*(){
  for await(const i of tryRecursive()){
    const result=await asyncDelay(()=>i)
    yield result}}
const testMultipleLoops2=(async()=>{
  const l=tryDelayYieldNumbers()
  let count=3
  for await(const i of l){if(count-->0)console.log(i);else break}
  count=4
  ///But `l` is closed here, can't do future looping
  for await(const i of l){if(count-->0)console.log(i);else break}
  count=5
  for await(const i of l){if(count-->0)console.log(i);else break}
})()

【问题讨论】:

  • 我看到 0、1、2 输出到控制台 - 你看到了什么?你希望看到什么?
  • 预期的 o/p 应该像 0,1,2,3,4,5,6,7,8,9,10,11。 @JaromandaX
  • 期望的输出是0, 1, 2, ... 11 - 预期的输出就是你得到的。
  • 谢谢!谢谢!谢谢! @Alnitak

标签: javascript async-iterator


【解决方案1】:

你要求的是不可能的。根据设计(以及根据语言规范),即使您使用 break 提前终止循环,您的 iterator 变量 lfor .. of 的末尾也会“关闭”。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of#Closing_iterators

【讨论】:

  • 是的!这是我看到的事实,但如果我使用while(true)l.next().value
  • 我真的不能循环多次。我怀疑它可以写成for await 风格。
  • 任何时候你在迭代器上使用for 保证迭代器在该块之后将不再可用。当您使用 l.next() 时不会发生这种情况,因为您直接与迭代器交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2012-10-14
  • 2014-12-25
  • 1970-01-01
  • 2012-03-30
  • 2010-09-16
相关资源
最近更新 更多