2016-10-06 28 views
5

Potrzebuję mieć "nieskończoną" pętlę while, która ma obietnice w środku. Oto przykładowy kod:Jak uzyskać nieskończoną pętlę asynchroniczną z obietnicami

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

Tak więc ta pętla while powinna działać bez końca, z wyjątkiem wystąpienia błędu, wtedy pętla while powinna się zatrzymać. Jak mogę to osiągnąć?

Mam nadzieję, że można zrozumieć, co mam na myśli i dzięki z góry :)

+1

reakcje REALIZACJI (wzywające spełnione lub koparki odrzucenie) są wykonywane asynchronicznie po wątku powodując ich być wykonana została zakończona. Pierwsza pętla while to nieskończona ** blokująca ** pętla, tworząca nieskończoną liczbę obietnic, które nigdy nie zostaną rozliczone, ponieważ opóźnienia wywołań zwrotnych nigdy nie występują: D _Possably_ chcesz timeout lub interwałowy timer, który czeka 3 sekundy po poprzedniej obietnicy utworzone dla asynchronicznego sprawdzania zostanie rozliczone przed uruchomieniem innego czeku? – traktor53

+0

Problem polega na tym, że tak naprawdę nie wiem, ile czasu zajmuje moja obietnica do rozwiązania, użyłem tylko 'setTimeout()' do wyjaśnienia mojego przykładu. Ale rozwiązanie Felixa Klinga działa idealnie, więc nie ma potrzeby innego rozwiązania, ale i tak dziękuję :) – C4rmond4i

Odpowiedz

4

W jaki sposób można to osiągnąć?

Nie z pętlą blokującą, ponieważ obietnice nie będą mogły zostać rozliczone. Możesz dowiedzieć się więcej o JavaScript's event loop on MDN.

Zamiast wywołać funkcję ponownie, gdy obietnica zostanie rozwiązany:

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

To też działa: P –

+0

Ah Najpierw się popsułem. Nie spojrzałem na oryginalny kod OP wystarczająco blisko. – Bergi

+0

Ten kod "zje" błąd, który prawdopodobnie wystąpi, prawdopodobnie w tym przypadku jest prawidłowy, ale BE BE WEARY z dowolnego '.catch ((err) => {}), który nie zawierają 'throw err;'. – kingdango