2013-10-30 16 views
6

Re: https://github.com/tildeio/rsvp.jsnasıl kolları başarısızlık geriçağırımlarının zinciri ile söz reddedilen rsvp.js

Ben bir süre için bir şey yapar ve daha sonra bir RSVP.Promise döndüren doSomething (adında bir işlevi) var. Ardından, bir başarı ve başarısızlık geri dönüşleri zinciri, geri verilen sözle kaydedilen 'dur (aşağıdaki kod). beklediğim davranış, eğer vaat yerine getirilirse, ile kaydedilen başarı geri dönüşler zincirinin kovulması söz konusu olacak ve eğer söz verilemezse (başarısız olursa), arıza geri çağırma zincirleri tetiklenecektir.

Söz verildikten sonra beklenen davranışı elde ediyorum, ancak söz verdiğim zaman reddedildiğimde beklediğimden farklı bir davranışı alıyorum. Yani, , başarı geri bildirimleri zincirlenir ve bir başarı geri dönüşünün çıkışı, zincirdeki bir sonraki başarı geri dönüşüne aktarılır. Ancak, başarısızlık geri arama zincirleri zincirleme değil görünüyor. Bir deneme/yakalama bloğundaki yakalama gibi davranırlar (bkz. Aşağıdaki kodu ve çıkışı).

birisi bu davranış açıklayabilir misiniz? Bu gerçekten çalışmak için varsayalım mı, yoksa bu , rsvp.js, onunla kaydedilmiş bir hata arızası zincirine sahip reddedilen/başarısız olan bir vaatte bulunma biçimindeki bir hata mıdır? Bunu denemek ve anlamaya çalışmak için şimdi Promises/A + spec'ı okuyorum, ama eğer birisi bu şeyleri başının üstünde biliyorsa, açıklamanızı duymak isterim. Şimdiden teşekkürler.

jsfiddle: Ben çıkış almak ve beklenen vaat yerine edildiğinde http://jsfiddle.net/rylie/VYSj7/2/

doSomething() // returns an RSVP.Promise object 
    .then(
     function(message) { console.log("then success 1: " + message); return "from success 1"; }, // success callback 
     function(message) { console.log("then failure 1: " + message); return "from failure 1"; } // failure callback 
    ) 
    .then(
     function(message) { console.log("then success 2: " + message); return "from success 2"; }, // success callback 
     function(message) { console.log("then failure 2: " + message); return "from failure 2"; } // failure callback 
    ) 
    .then(
     function(message) { console.log("then success 3: " + message); return "from success 3"; } // success callback 
    ) 
    .then(
     null, 
     function(message) { console.log("then failure 4: " + message); return "from failure 4"; } // failure callback 
    ) 
    .then(
     function(message) { console.log("then success 5: " + message); return "from success 5"; }, // success callback 
     function(message) { console.log("then failure 5: " + message); return "from failure 5"; } // failure callback 
    ); 

** (başarılı), bu edilmektedir:

then success 1: Promise fulfilled! 
then success 2: from success 1 
then success 3: from success 2 
then success 5: from success 3 

** vaadi reddedilir

(başarısız), aldığım şu çıktı: (reddedildiğimde) bu beklediğim şeydir./Başarısız vaadi):

then failure 1: Promise rejected! 
then failure 2: from failure 1 
then failure 4: from failure 2 
then failure 5: from failure 4  

cevap

11

sadece .then() bile 1'den fazla argüman alır unutup .catch yöntemi kullanmak ve onu daha mantıklı olacaktır gerekir.

Sözler, bazı eşitleme kod yapılarına bir yazışma sağlar, ancak bu yalnızca .then() düzeyindeki bir düşük seviyeniz olduğunda görünmez. Aradığınız şey temel olarak bir dizi geri arama/geri arama toplamasıdır, ancak bu sözün anlamı değildir..catch(fn) aynı .then(null, fn) olarak bir

Think:

doSomething().then(function(val) { 
    console.log(val); 
}).catch(function(e) { 
    console.error(e); 
}); 

senkronizasyon kodu Parallels (eşzamanlı doSomething döner hayal):

try { 
    var val = doSomething(); 
    console.log(val); 
} 
catch(e) { 
    console.error(e); 
} 

Çoklu yakalar (.catch daha okunabilir takma .then(null, fn)

olduğunu hatırlamak
doSomething().then(function(val) { 
    console.log(val); 
}).catch(function(e) { 
    return e; 
}).catch(function(e){ 
    //Will not get here ever 
    //because error thrown from doSomething() 
    //was handled in the upper catch which doesn't trow 
}); 

paraleller: Yani

try { 
    try { 
     var val = doSomething(); 
     console.log(val); 
    } 
    catch(e) { 
     //no need for explicit return e 
    } 
} 
catch(e) { 
    //Will not get here ever 
    //because error thrown from doSomething() 
    //was handled in the upper catch which doesn't trow 
} 

şimdi sen atma yerine

.catch()http://jsfiddle.net/VYSj7/3/ IMO sağlamak için bir söz kitaplığı için gerekli bir yöntemdir dönen beklediği sonuç oluşturabilir fark olmalı ve aynı zamanda olacak Gelecekte yerleşik Javascript sözlerine dahil.

Promise.prototype.catch = function(fn) { 
    return this.then(null, fn); 
}; 

Ayrıca bkz rejection turns into fulfillment

+0

Güzel açıklama, Esailija: Böyle bir yöntem sağlanmazsa Ancak, şunları yapabilirsiniz (veya olması gerektiği, ne yazık ki prototipler kullanmayan uygulamalar vardır)! Teşekkürler. – RBR

İlgili konular