Loops 而使用等待异步的循环。
此Javascript函数似乎以异步方式使用while循环。 在异步条件下使用while循环是否正确Loops 而使用等待异步的循环。,loops,asynchronous,while-loop,async-await,ecmascript-next,Loops,Asynchronous,While Loop,Async Await,Ecmascript Next,此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
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 Wait+while循环的方法吗
谢谢
在异步条件下使用while循环是否正确
var Boo;
var Foo = await getBar(i)
while(Foo) {
Boo = await getBar3(i)
if (Boo) {
// something
}
Foo = await getBar(i)
i++
}
对<代码>异步函数s只需在每个
上暂停执行,等待
,直到相应的承诺兑现,并且任何控制结构都会像以前一样继续工作。自从提出这个问题以来,已经有一段时间了。在学习了多年其他语言(从穿孔卡片和纸带开始)之后,我对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可以在work函数中设置,也可以在promise的catch(或者可以是then)中设置。我厌倦了在then或catch中使用“break”,但我犯了一个错误
如果要在doWork中执行此操作,可以消除catch,只需调用doWork()并在doWork中取消注释//loopContinue=false。两种方法都有效。这是用node.js测试的
我在nextTick上找到了一些东西,但这似乎容易多了。是的,这样做很好:
let stopped = false
// infinite loop
while(!stopped) {
let res = await fetch('api link')
if (res.something) stopped = true // stop when you want
}
在异步条件下使用while循环是否正确
var Boo;
var Foo = await getBar(i)
while(Foo) {
Boo = await getBar3(i)
if (Boo) {
// something
}
Foo = await getBar(i)
i++
}
是,前提是getBar
和getBar3
是异步函数(标记为异步或仅返回承诺
)
当然执行应该在异步上下文中执行(在async
函数中)
我能看到的一个可能的问题是,最初有两个getBar
的执行使用相同的I
,其余的执行在while
和if
之间使用不匹配的I
如果这不是期望的行为也许更正确的版本是:
(异步()=>{
while(wait getBar(i)){
如果(等待getBar3(i)){
//做点什么
}
i++;
}
})();
参见模拟示例仅供参考,async/await不是ES 6.await转换为状态机的一部分。你可以像你写的那样拥有许多小的状态机(很难理解),也可以拥有一个更大的状态机(例如C#所做的)。你所说的“正确的方式”是什么意思?如果这段代码符合您的要求,那么它是正确的。我不能像我所希望的那样对它进行测试,它在我对它应该做什么的解释中按照预期工作,但不确定这是否仅仅是运气。