Как * вновь открыть * AsyncIterator после разрыва цикла "для ожидания"?
В функции testMultipleLoops2
после первого for await
, 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}
})()
1 ответ
То, что вы просите, невозможно. По дизайну (и согласно спецификации языка) ваш iterator
переменная l
"закрыт" в конце for .. of
даже если вы рано завершите цикл с break
,