2015-02-17 18 views
7

Ben ille hata istemiyorum ama var:Bir zinciri erkenden Bluebird Promises ile kırabilir miyim?

getFromDb().then (tradeData) -> 
    if not tradeData 
    # DO NOT CONTINUE THE CHAIN 
    else 
    getLatestPrice tradeData 
.then (latestPrice) -> 
    ... 
.then -> 
    ... 
.then -> 
    ... 
.catch (err) -> 
    next err 

hiçbir tradeData varsa zincirini iptal etmek benim için herhangi bir yolu?

+0

değil (açıkça olarak çözmek-başarısız olan birini yeni bir söz iade edebilir uygun) bb sonra '' '? Eğer sadece "zinciri bozmak" işe yaramazsa o zaman bir zincir değildir. – user2864740

+0

Sen (http://stackoverflow.com/q/20714460/1048572) [o kırık zincirdeki aşamasına dayanarak bir işlevi Molası söz zinciri ve çağrı] bakmak isteyeceksiniz ve [Birden yakalar Handling söz zincirinde] (http://stackoverflow.com/q/26076511/1048572) – Bergi

cevap

7
getFromDb().then (tradeData) -> 
    if tradeData 
    getLatestPrice tradeData -> 
     .then (latestPrice) -> 
     ... 
     .then -> 
     ... 
     .then -> 
     ... 
     .catch (err) -> 
     next err 
    else 
    getSomethingElse -> 
     send("no data") 

3.0 olarak, bunu yapmak mümkün olacak: Kabul edilen bir yanıt olsa da

p = getFromDb().then (tradeData) -> 
    if not tradeData 
    send("no data"); 
    p.break() 
    else 
    getLatestPrice tradeData 
.then (latestPrice) -> 
    ... 
.then -> 
    ... 
.then -> 
    ... 
.catch (err) -> 
    next err 
+1

Ek dallanma mantığı uygulamak istersem ne olur? Örneğin, 'tradeData' varsa, belirli adımlar varsa, başka adımlar atıyor musunuz? – Shamoon

+1

@Shamoon bir 'else' kullanmak – Esailija

+0

@Shamoon: Tabii, ayrıca' bir "veri yok" istisna ve [denetim akışı için kullanılması reddetme durumlarını] (throw' olabilir http://stackoverflow.com/a/24663315/1048572). Bu özellikle – Bergi

7

, ama o, "sonu()" fonksiyonu değişmiştir Google'cuların tüm anlatmak istiyorum "iptal()" için böyle

Kullanım şey: Bundan önce

p = getFromDb().then (tradeData) -> 
    if not tradeData 
    send("no data"); 
    p.cancel(); // Look Here!!!!!!!!!!!!!!!! 
    else 
    getLatestPrice tradeData 
.then (latestPrice) -> 
    ... 
.then -> 
    ... 
.then -> 
    ... 
.catch (err) -> 
    next err 

, c aşağıdaki satırları ekleyin emin olun onfig: Eğer throw Eğer instanceof Error değil sadece bir şey ister ne olursa olsun gerçeği bir yararı almayan neden

Promise.config({ 
    cancellation: true 
}); 
+0

benim için çalışıyor teşekkürler – anhnt

0

Im sadece merak. Bunu yapmak için kötü bir uygulama olarak kabul edilir? Benim düşünceme göre, buna bağlı olarak, neyi başarmaya çalıştığınıza bağlı. Söz zincirleri çeşitli nedenlerle kesintiye uğrayabilir, ancak genellikle bu ikisi iki gruba ayrılır. Classic error occur ve early break in chain gerekli. Mantıksal olarak ikincisi, instance of Error olması gereken bir şey olarak değerlendirilemez. mantıksal olarak, zincirde erken kesintili (tamamen durumda olabilir) hatası olarak kabul edilebilir ise

const handleError = (err) => { 
    ... 
} 

const skip = (reason, ..., ...) => { 
    /** 
    * construct whatever you like 
    * just for example here return reason 
    */ 
    return reason 
} 

Promise.resolve() 
.then(() => { 
    if (iShouldEndChainEarlier) { 
    throw skip('I would like to end chain earlier') 
    } 

    return asyncOperation1() 
}) 
.then(results => { 
    ... 
    return asyncOperation2(results) 
}) 
.then(... => { 
    ... 
}) 
.catch(interrupt => { 
    if (interrupt instanceof Error) { 
    return handleError(interrupt) 
    } 

    /** 
    * Handle breaking promise chain earlier 
    * having interrupt reason in scope 
    */ 
}) 

olarak, özel hata oluştur ve iki catch blok arasında ayrım olabilir. Öyleyse, sözün zincirinde meydana gelebilecek herhangi bir kesintiyi ele alırken, başka birinin bir yaklaşımı düşünebileceğini söylüyorsunuz. Biz iddia olabilir

bu düğümünde first error pattern karşı bir şey olarak kabul edilebilir yapar. Bir hata varsa iyi uygulama err gerçekten instanceof Error aksi callback(null, data) olması gereken yerde callback(err) gibi geri arama çağırmak olacaktır. Ama akılda sahip diğer tarafta .catch(fn) o içinde bulunduğunuz durum dayalı onRejected parametre işlemek için yeterince iyi görünüyor bana then(undefined, onRejected) için sadece şeker olduğunu.

İlgili konular