2016-10-06 2 views
5

그 안에 약속이있는 "끝이없는"while-loop가 필요합니다. 여기에 몇 가지 예제 코드입니다 : 오류가 발생하는 것을 제외하고 약속과 함께 비동기식 무한 루프를 갖는 방법

let noErrorsOccured = true 

while (noErrorsOccured){ 
    someAsyncFunction().then(() => { 
     doSomething(); 
    }).catch((error) => { 
     console.log("Error: " + error); 
     noErrorsOccured = false; 
    }); 
} 

function someAsyncFunction() { 
    return new Promise ((resolve, reject) => { 
     setTimeout(() => { 
      const exampleBool = doSomeCheckup(); 
      if (exampleBool){ 
       resolve(); 
      } else { 
       reject("Checkup failed"); 
      } 
     }, 3000); 
    }); 
} 

그래서이 동안 ​​루프가 무한 실행해야는 다음 동안 루프를 중지해야합니다. 이것을 어떻게 할 수 있습니까?

나는 당신은 내가 무엇을 의미하는 감사

+1

약속 반응 (전화를 충족 또는 거부 핸들러)가 그들이 완료 실행되는 일으키는 스레드 후 비동기 적으로 실행됩니다. 첫 번째 while 루프는 무한 ** 차단 ** 루프이므로 제한 시간 초과 콜백이 발생하지 않으므로 결코 확정되지 않는 무한한 약속이 생성됩니다. D _Possibly_ 이전 약속 이후 3 초를 기다리는 제한 시간 타이머 또는 간격 타이머를 원합니다. 비동기 검사를 위해 생성 된 검사는 다른 검사를 실행하기 전에 해결됩니까? – traktor53

+0

문제는 내가 내 약속을 해결하는 데 얼마나 오래 걸리는지 모르겠다. 필자의 예를 명확히하기 위해'setTimeout()'만 사용했다. 하지만 Felix Kling의 솔루션은 완벽하게 작동하므로 다른 솔루션은 필요 없지만 어쨌든 감사합니다. – C4rmond4i

답변

4

가 어떻게 이것을 달성 할 수있는 사전 : 이해할 수 있기를 바랍니다?

약속을 정할 수 없으므로 차단 루프가 아닙니다. JavaScript's event loop on MDN에 대해 자세히 알아볼 수 있습니다. 약속이 해결 될 때

대신, 다시 함수를 호출 :

Promise.resolve().then(function resolver() { 
    return someAsyncFunction() 
    .then(doSomething) 
    .then(resolver); 
}).catch((error) => { 
    console.log("Error: " + error); 
}); 
+0

그게 효과가 있습니다 : P –

+0

아, 처음에 엉망이되었습니다. OPs 원래 코드를 충분히 보지 않았습니까 – Bergi

+0

이 코드는 발생하는 오류를 "먹습니다"하지만이 경우에는 문제가되지 않지만'.catch ((err) => {})'는 그렇지 않습니다. 'throw err;을 포함한다. – kingdango

관련 문제