While loops using Await Async.

后端 未结 4 1684
旧时难觅i
旧时难觅i 2020-12-29 04:24

This Javascript function seems to use the while loop in an asynchronous way. Is it the correct way to use while loops with asynchronous conditions?

 var Boo         


        
4条回答
  •  时光取名叫无心
    2020-12-29 04:42

    Its been awhile since this question was asked. I am new to js after many years of other languages (starting with punch cards and paper tape) and needed to solve this problem. Here is my answer:

    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);
      });
    }
    

    As desired the loop breaks after the 5th iteration. 'loopContinue' global can either be set in the work function or in the catch (or could be the then) of the promise. I tired just using 'break' in the then or catch but I get an error.

    If you want to do it in doWork you can eliminate the catch and and just call doWork() and uncomment the // loopContinue= false in doWork. Either way works. This was tested with node.js

    I found stuff on nextTick but this seems much easier.

提交回复
热议问题