2016-05-09 18 views
5
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 
}) 

Làm cách nào để mã trên được sửa đổi để ngắt sớm (bỏ qua ngày 2 sau đó())?Bluebird - cách phá vỡ chuỗi lời hứa sớm

+0

trở Promise.reject (Lỗi mới ("hãy bắt tôi")) – Yerken

+0

Hoặc tốt hơn 'ném Lỗi mới ("hãy bắt tôi"); '. Điều này trông giống như một bản sao. – Shanoor

+1

Nhưng trong trường hợp đó catch() được gọi, mà tôi không muốn. – Jonah

Trả lời

5

Bluebird cho phép cancel a promise:

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 
}); 
+0

Không p cần phải được xác định trước khi được triệu tập? Khi p được gọi đầu tiên ở đây, nó không giống như nó được định nghĩa. – Jonah

+0

@Jonah Chúng tôi đang ở trong môi trường không đồng bộ, chức năng không được thực thi ngay lập tức (nó là dấu tick tiếp theo), vào lúc đó, 'p' được xác định. – Shanoor

+0

không phải là 'p' được đặt thành giá trị của câu lệnh cuối cùng trong chuỗi -' catch' trong trường hợp này? Tuy nhiên, lệnh catch không được thực hiện cho đến sau khi 'p.cancel()' được gọi là – Jonah

Các vấn đề liên quan