2016-10-06 17 views
5

ile eşzamansız sonsuz bir döngüye nasıl sahip olunur İçinde vaatleri olan "sonsuz" bir while döngüsüne sahip olmam gerekir. İşte bazı örnek kod: bir hata oluşursa hariç Promises

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

Yani bu süre döngü, sonsuz çalışmalıdır, daha sonra ise döngü durmalıdır. Bunu nasıl başarabilirim?

Sana neyi demek ve teşekkür

+1

Promise reaksiyonları (çağırarak yerine veya ret işleyicileri) onları tamamladı yürütülecek yol açan bir bir iplik sonra zaman uyumsuz yürütülür. İlk while döngüsü sonsuz bir ** engelleme ** döngü, zaman aşımı geri aramaları asla oluşmaz çünkü asla yerleşmiş sonsuz sayıda sözler yaratma: D _Possibly_ Eğer bir önceki söz sonra 3 saniye beklemek bir zaman aşımı veya aralık zamanlayıcı istiyorum Eşzamansız kontrol için oluşturulan başka bir çek çalıştırmadan önce yerleşmiş olur? – traktor53

+0

Sorun şu ki, sözümü çözmenin ne kadar sürdüğünü gerçekten bilmiyorum, örneğimi açıklığa kavuşturmak için sadece setTimeout() kullandım. Ama Felix Kling'in çözümü mükemmel çalışıyor, bu yüzden başka bir çözüme gerek yok, ama yine de teşekkürler :) – C4rmond4i

cevap

4

Bunu nasıl elde edebilirsiniz peşin :) anlamak umut?

Sözler yerine getirilemeyeceği için engelleme döngüsü ile olmaz. JavaScript's event loop on MDN hakkında daha fazla bilgi edinebilirsiniz. söz çözüldüğünde

Bunun yerine, yine işlevini çağırır:

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

Bu da işe yarıyor: P –

+0

Ah İlk başta berbat ettim. OP'lerin orijinal koduna yeterince yakından bakmadılar – Bergi

+0

Bu kod, oluşan hatayı "yiyecek", muhtemelen bu durumda iyi olacak, ancak herhangi bir '.catch ('err' = '{}} 'throw err;' içerir. – kingdango

İlgili konular