Bluebird - วิธีทำลายสัญญาตั้งแต่เนิ่นๆ

PromiseA().then(function(dataA){
    if (dataA.foo == "skip me")
        return ?? //break promise early - don't perform next then()
    else
        return PromiseB()
}).then(function(dataB){
    console.log(dataB)
}).catch(function (e) {
    //Optimal solution will not cause this method to be invoked
})

โค้ดด้านบนสามารถแก้ไขได้อย่างไรให้พังเร็ว (ข้ามอันที่ 2 แล้ว ())


person Jonah    schedule 09.05.2016    source แหล่งที่มา
comment
return Promise.reject (ข้อผิดพลาดใหม่ (โปรดจับฉันด้วย))   -  person Yerken    schedule 09.05.2016
comment
หรือดีกว่าthrow new Error("please catch me");. ดูเหมือนว่าจะซ้ำกัน   -  person Shanoor    schedule 09.05.2016
comment
แต่ในกรณีนั้น catch() จะถูกเรียกใช้ซึ่งฉันไม่ต้องการ   -  person Jonah    schedule 09.05.2016
comment
ดู stackoverflow.com/questions/28803287/ วิธีทำลายสัญญาห่วงโซ่/ ใช้ return { then: function() {} };   -  person Martin    schedule 27.07.2017


คำตอบ (1)


Bluebird อนุญาตให้ยกเลิกสัญญา:

var Promise = require('bluebird');
Promise.config({
    // Enable cancellation
    cancellation: true,
});

// store the promise
var p = PromiseA().then(function(dataA){
    if (dataA.foo == "skip me")
        p.cancel(); // cancel it when needed
    else
        return PromiseB();
}).then(function(dataB){
    console.log(dataB);
}).catch(function (e) {
    //Optimal solution will not cause this method to be invoked
});
person Shanoor    schedule 09.05.2016
comment
ไม่จำเป็นต้องกำหนด p ก่อนที่จะถูกเรียกใช้ใช่ไหม เมื่อ p ถูกเรียกใช้ครั้งแรกที่นี่ ดูเหมือนว่ายังไม่ได้ถูกกำหนดไว้ - person Jonah; 09.05.2016
comment
@โจนาห์ เราอยู่ในสภาพแวดล้อมแบบอะซิงก์ ฟังก์ชันจะไม่ถูกดำเนินการทันที (อยู่ที่เครื่องหมายถัดไป) เมื่อถึงเวลา p ถูกกำหนดไว้ - person Shanoor; 09.05.2016
comment
ไม่ได้ตั้งค่า p เป็นค่าของคำสั่งสุดท้ายในกลุ่ม - catch ในกรณีนี้ อย่างไรก็ตาม การจับจะไม่ถูกดำเนินการจนกว่าจะมีการเรียก p.cancel() - person Jonah; 09.05.2016
comment
วิธีการของสัญญาจะส่งคืนสัญญาเดิมพร้อมกันเสมอเพื่อรับประกันว่าคุณจะสามารถโยงกับวิธีการอื่น ๆ ต่อไปได้ ดังนั้นมูลค่าของการเรียกลูกโซ่จึงเป็นสัญญาเดียวกันเสมอ ตัวอย่าง const p = Promise.then(...).then(); ส่งคืนสัญญา แล้วคุณก็สามารถทำได้: p.then(...).catch(...); - person SimoAmi; 26.01.2017