Kodumda uzun zamandır beni şaşırmış bir hataya rastladım ve bazı açıklamaları arıyorum. Bu kodda Anlamak .then() ES6
, dışarı yorumladı iç vaadi bir soruna neden oldu. Sonunda Promise.all(), setTimeout isabeti en kısa sürede, zaman aşımı içindeki çözümden sonra değil, devam ediyordu.vaadi ile zaman uyumsuz kod akış problemi giderir tamamlayan, ama neden burası?
Esasen, neden sadece .sonra içinde() zinciri, zaman uyumsuz geri arama sonunda bir dönüşü bir Promise.resolve() Normal zaman uyumsuz kodunu koşamam? çalışan koda
var asyncPromise = function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('Async Promise done');
resolve();
}, 1000);
});
};
var generateSignupPromises = function(qty) {
var promiseArray = [];
for (var i = 1; i <= qty; i++) {
promiseArray.push(
function() {
return asyncPromise()
.then(function() {
console.log('Before Timeout');
//Uncommenting this fixes the issue
//return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('After Timeout');
//resolve();
return Promise.resolve();
}, 500);
//})
});
}
);
}
return promiseArray;
};
var test = generateSignupPromises(1);
Promise.all([test[0]()])
.then(function() {
console.log('Done');
});
Bağlantı: http://www.es6fiddle.net/imfdtuxc/
Ne yapmak çalıştığınız şeyi söyleyemem: Bir geri arama gelen bir söz dönebilir ve bu nihai sonuca başka söz almak istiyorsanız
, bir
then
geri arama olmalıdır ancak setTimeout() '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' \ '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' hiçbir şey iade edilen değere dikkat etmeyecektir. – PointyDoom Piramidi + anonim işlevlerin bolluğu = okunamayan kod + beklenmedik davranış. – Amit
setTimeout eşzamansız değil. Eşzamanlı olarak döndürülür ve sonra() 'ın' vaat 'olan tanımsız sona dönmesine neden olur. Ekstra satırınızı ekleyerek, "çözüme" kadar bekleyecek başka bir söz verir. BTW. Bu sözlerin nasıl kullanılması gerektiği değildir. – Wainage