Bluebird - cara memutus rantai janji sejak dini

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
})

Bagaimana kode di atas dapat dimodifikasi agar rusak lebih awal (lewati kode ke-2 lalu())?


person Jonah    schedule 09.05.2016    source sumber
comment
return Promise.reject (Kesalahan baru (tolong tangkap saya))   -  person Yerken    schedule 09.05.2016
comment
Atau lebih baik throw new Error("please catch me");. Ini terlihat seperti duplikat.   -  person Shanoor    schedule 09.05.2016
comment
Namun dalam hal ini catch() dipanggil, yang tidak saya inginkan.   -  person Jonah    schedule 09.05.2016
comment
Lihat stackoverflow.com/questions/28803287/ cara-menghancurkan-rantai-janji/ Gunakan return { then: function() {} };   -  person Martin    schedule 27.07.2017


Jawaban (1)


Bluebird memungkinkan untuk membatalkan janji:

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
Bukankah p perlu didefinisikan sebelum dipanggil? Saat p pertama kali dipanggil di sini, sepertinya p belum terdefinisi. - person Jonah; 09.05.2016
comment
@Jonah Kita berada di lingkungan async, fungsinya tidak langsung dijalankan (ada di centang berikutnya), pada saat itu, p ditentukan. - person Shanoor; 09.05.2016
comment
bukankah p disetel ke nilai pernyataan terakhir dalam rantai - catch dalam kasus ini? Namun, tangkapan tidak dieksekusi sampai p.cancel() dipanggil - person Jonah; 09.05.2016
comment
Metode janji akan selalu mengembalikan janji yang sama secara sinkron untuk menjamin bahwa Anda dapat terus menyambungkannya dengan lebih banyak metode. jadi nilai dari panggilan berantai selalu merupakan janji yang sama. Contoh const p = Promise.then(...).then(); mengembalikan janji. dan kemudian Anda dapat melakukan: p.then(...).catch(...); - person SimoAmi; 26.01.2017