Loops 而使用等待异步的循环。

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

此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 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#所做的)。你所说的“正确的方式”是什么意思?如果这段代码符合您的要求,那么它是正确的。我不能像我所希望的那样对它进行测试,它在我对它应该做什么的解释中按照预期工作,但不确定这是否仅仅是运气。