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
Is it the correct way to use while loops with asynchronous conditions?
Yes, provided that getBar
and getBar3
are asynchronous functions (marked as async or just returning a Promise
).
Of course the execution should be inside an asynchronous context (inside async
function)
A possible issue that I can see is that initially there are 2 executions of getBar
with the same i
and the rest of executions use a mismatched i
between while
and if
. If this is not the desired behavior perhaps a more correct version would be:
(async ()=>{
while(await getBar(i)) {
if (await getBar3(i)) {
//do something
}
i++;
}
})();
See a mocked example here
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.
Yep, it's fine to do it like this:
let stopped = false
// infinite loop
while(!stopped) {
let res = await fetch('api link')
if (res.something) stopped = true // stop when you want
}
Is it the correct way to use while loops with asynchronous conditions?
Yes. async function
s simply suspend their execution on every await
until the respective promises fulfills, and any control structures continue to work as before.