这个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...}
}
}
}
})
如果完全错误,你可以用async await + while循环显示另一种方法吗?
谢谢!
答案 0 :(得分:14)
使用具有异步条件的while循环是否正确?
是。 async function
只是在每个await
暂停执行,直到各自的承诺完成,并且任何控制结构都会像以前一样继续工作。
答案 1 :(得分:4)
在异步条件下使用while循环是否正确?
是,假设getBar
和getBar3
是异步函数(标记为异步或仅返回Promise
)。
当然执行应该在异步上下文中(在async
函数内部)
我可以看到的一个可能的问题是,最初有2个getBar
执行与相同的i
,其余执行使用不匹配的{{1} }在i
和while
之间。 如果这不是理想的行为,则可能是更正确的版本:
if
查看模拟示例here
答案 2 :(得分:1)
是的,可以这样做:
let stopped = false
// infinite loop
while(!stopped) {
let res = await fetch('api link')
if (res.something) stopped = true // stop when you want
}
答案 3 :(得分:0)
自问这个问题以来已经有一段时间了。经过多年的其他语言(从穿孔卡和纸带开始),我是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'全局可以在工作函数中设置,也可以在promise的catch(或者可能是then)中设置。我厌倦了在当时使用'break'或者赶上但是我得到了一个错误。
如果你想在doWork中执行它,你可以消除catch并且只需调用doWork()并在doWork中取消注释// loopContinue = false。无论哪种方式都有效。这是使用node.js
测试的我在nextTick上找到了东西,但这似乎更容易。