使用等待异步的循环。
问题描述:
这个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循环,这是完全错误的?
谢谢!
答
这是正确的方式来使用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上的东西,但这似乎更容易。
只是FYI,异步/等待不是ES 6的一部分。 –
等待转换成状态机。你可以像你写的那样拥有许多小型状态机(很难推理),或者你可以有一个更大的状态机(这就是C#所做的)。 –
“正确的方式”是什么意思?如果这个代码做你想要的,那么它是正确的。 –