5

이 Javascript 함수는 while 루프를 비동기 방식으로 사용하는 것 같습니다. 비동기 조건이있는 while 루프를 사용하는 올바른 방법입니까? 당신이 비동기와 함께 할 수있는 또 다른 방법은 루프 동안 + 기다리고 있습니다 보여줄 수있는 완전히 거짓 경우Await Async를 사용하는 While 루프입니다.

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

:

var Boo; 
var Foo = await getBar(i) 
while(Foo) { 
    Boo = await getBar3(i) 
    if (Boo) { 
     // something 
    } 
    Foo = await getBar(i) 
    i++ 
    } 

내가 그것을하지 생각하면이 무엇입니까?

감사합니다.

+0

참고로 비동기/대기는 ES 6의 일부가 아닙니다. –

+0

상태 기계로 변환됩니다. 당신이 작성한 것처럼 많은 수의 작은 상태 머신을 가질 수도 있고 (또는 매우 추론하기가 어렵거나), 하나의 큰 상태 머신 (예 : C#이하는 것)을 가질 수 있습니다. –

+0

"올바른 방법"이란 무엇을 의미합니까? 이 코드가 원하는대로 작동하면 올바른 것입니다. –

답변

8

비동기 조건이있는 while 루프를 사용하는 올바른 방법입니까?

예. async function은 각각의 약속이 충족 될 때까지 모든 await에 대한 실행을 일시 중지하며 모든 제어 구조는 이전과 같이 계속 작동합니다.

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'global은 work 함수 나 약속의 catch (또는 then) 일 수 있습니다. 나는 그저 'break'를 사용하는 것에 지치거나 잡기는했지만 오류가 발생합니다.

doWork에서 작업하려면 catch를 제거하고 doWork()를 호출하고 doWork에서 // loopContinue = false의 주석 처리를 제거하십시오. 어느 쪽이든 작동합니다. 이것은 node.js로 테스트되었습니다

nextTick에서 물건을 찾았지만 훨씬 쉬워 보입니다.

관련 문제