2015-08-18 23 views
7

Birisi, aşağıdaki koddan çıkan sonucun (d) neden hemen çözüleceğini bana açıklayabilir mi?Neden bu söz zincirleri derhal çözülür?

//promises that are never resolved nor rejected 
var a = new Promise(function(r,re){}); 
var b = new Promise(function(r,re){}); 
var c = new Promise(function(r,re){}); 

var d = [a, b, c].reduce(function (previousPromise, promise) { 
    return previousPromise.then(promise); 
    }, Promise.resolve()); 

Sonsuza bekleyen vaat dizisi oluşturuyorsam, bu nedenle sonraki tüm sözler (as presented here) bitirmek için bekler olarak ortaya çıkan söz de sonsuza bekleyen edilmelidir. Bir süredir vaatler kullanıyorum, ama burada bir şeyleri açıkça eksik.

Chrome DevTools - promises code executed

cevap

11

then o Ret 2 fonksiyonları yerine getirilmesi için 1 ve 1 sürer, girdi olarak bir Promise almaz.

d çözülene nedeni olmayan bir çağrılabilir değere (hatta bir hazır sayısı - 1 veya undefined) ile .o çağırarak gerçeği nedeniyle onFulfilled işlevi basitçe yeniden "Kimlik" tarafından yerine neden olur Bir önceki adımda hangi değere sahip olursa olsun doldurur. ... alternatif

//promises that are never resolved nor rejected 
var a = function() { return new Promise(function(r,re){}); }; 
var b = function() { return new Promise(function(r,re){}); }; 
var c = function() { return new Promise(function(r,re){}); }; 
// or simply, a = b = c after setting the function for c 

var d = [a, b, c].reduce(function (previousPromise, fn) { 
    return previousPromise.then(fn, /* not passing a rejection handler... */); 
    }, Promise.resolve()); 

Ya

//promises that are never resolved nor rejected 
var a = new Promise(function(r,re){}); 
var b = new Promise(function(r,re){}); 
var c = new Promise(function(r,re){}); 

var d = [a, b, c].reduce(function (previousPromise, promise) { 
    return previousPromise.then(function() {return promise;}); 
    }, Promise.resolve()); 

Ve ES6 sözler & kullanıyorsanız beri, daha özlü olabilir: böyle deneyin PerformPromiseThen

Bkz

let a = new Promise(() => {}); 
let b = new Promise(() => {}); 
let c = new Promise(() => {}); 

let d = [a, b, c].reduce((previousPromise, promise) => 
    previousPromise.then(() => promise), 
    Promise.resolve()); 
+0

Küçültme belgelerini kontrol edin. Daha sonra Promise.resolve() nasıl olur (yeni Promise (function (r, re) {})), beklemedeki bir sözü düzeltir? – CodingIntrigue

+0

@RGraham aslında değil –

+0

@JaromandaX Belki de yanlış günlüğe kaydediyorum. http://i.imgur.com/jEkWokl.png – CodingIntrigue

İlgili konular