while循环使用Await Async。

时间:2016-08-23 21:13:55

标签: 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( (a) => {
  Foo = a;
  if(Foo) {
    getBar3(i).then( (a) => {
      Boo = a
      if(Boo) {
        //something
        i++;
        getBar(i).then( (a} => { Repeat itself...} 
      }
   }
  }
})

如果完全错误,你可以用async await + while循环显示另一种方法吗?

谢谢!

4 个答案:

答案 0 :(得分:14)

  

使用具有异步条件的while循环是否正确?

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

答案 1 :(得分:4)

在异步条件下使用while循环是否正确?

假设getBargetBar3是异步函数(标记为异步或仅返回Promise)。

当然执行应该在异步上下文中(在async函数内部)

我可以看到的一个可能的问题是,最初有2个getBar执行与相同的i,其余执行使用不匹配的{{1} }在iwhile之间。 如果这不是理想的行为,则可能是更正确的版本:

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上找到了东西,但这似乎更容易。