使用等待异步的循环。

问题描述:

这个Javascript函数似乎以异步方式使用while循环。 这是正确的方式来使用while循环与异步条件?使用等待异步的循环。

var Boo; 
var Foo = await getBar(i) 
while(Foo) { 
    Boo = await getBar3(i) 
    if (Boo) { 
     // something 
    } 
    Foo = await getBar(i) 
    i++ 
    } 

我认为它是这样的:

var Boo; 
var Foo; 
getBar(i).then((a) => { 
    Foo = a; 
    if(Foo) { 
    getBar3(i).then((a) => { 
     Boo = a 
     if(Boo) { 
     //something 
     i++; 
     getBar(i).then((a} => { Repeat itself...}  
     } 
    } 
    } 
}) 

如果你能表现出另一种方式与异步做到这一点伺机+ while循环,这是完全错误的?

谢谢!

+0

只是FYI,异步/等待不是ES 6的一部分。 –

+0

等待转换成状态机。你可以像你写的那样拥有许多小型状态机(很难推理),或者你可以有一个更大的状态机(这就是C#所做的)。 –

+0

“正确的方式”是什么意思?如果这个代码做你想要的,那么它是正确的。 –

这是正确的方式来使用while循环与异步条件?

是的。 async function只需在每个await之前暂停执行,直到相应的承诺完成,并且任何控制结构继续像以前一样工作。

自问这个问题以来,它已经有一段时间了。我是多年来从事其他语言(从打孔卡和纸带开始)并且需要解决此问题的js的新手。这是我的答案:

var loopContinue = true; 
var n = 0; 

async function Managework() { 
    while (loopContinue) { //seemingly an infinite loop 
    //await (doWork(n)); 
    await (doWork(n).catch(() => { loopContinue=false; })); 
    n++; 
    console.log(`loop counter ${n}`); 
    } 
    console.log(`loop exit n=${n} loopContinue=${loopContinue}`); 
} 

Managework(); 

function doWork(n) { 
return new Promise((resolve, reject) => { 
    console.log(`dowork(${n})`); 
    if (n > 5) { 
     //loopContinue = false; 
     reject(`done`); 
    } 
    setTimeout(() => { 
     resolve('ok'); 
    }, 1000); 
    }); 
} 

根据需要循环在第5次迭代后中断。 'loopContinue'global可以在工作函数中设置,也可以在承诺的catch(或可能是then)中设置。我厌倦了在当时使用'休息'或抓住,但我得到一个错误。

如果你想在doWork中做到这一点,你可以消除catch并且只需调用doWork()并取消doWork中// loopContinue = false的注释。无论哪种方式工作。这与node.js测试

我发现了nextTick上的东西,但这似乎更容易。