2017-05-04 137 views
1

在這種情況下,我應該如何停止承諾鏈? 只有當第一個條件爲真時,才執行第二個代碼。如何破解承諾鏈?

var p = new Promise((resolve, reject) => { 
    setTimeout(function() { 
     resolve(1) 
    }, 0); 
}); 

p 
.then((res) => { 
    if(true) { 
     return res + 2 
    } else { 
     // do something and break the chain here ??? 
    } 
}) 
.then((res) => { 
    // executed only when the condition is true 
    console.log(res) 
}) 
+3

只會拋出一個錯誤在這裏工作你的用例?如果你拋出任何類型的錯誤(甚至只是拋出新的Error();'應該可能工作),你不會進入你的下一個然後 – jas7457

+0

是的我知道,但它會打破承諾鏈,因此不會打到下一個。如果這就是他正在嘗試做的所有事情,這將起作用 – jas7457

回答

4

您可以throwelse塊的Error,然後catch它在承諾鏈的末端:

var p = new Promise((resolve, reject) => { 
    setTimeout(function() { 
     resolve(1) 
    }, 0); 
}); 

p 
.then((res) => { 
    if(false) { 
     return res + 2 
    } else { 
     // do something and break the chain here ??? 
     throw new Error('error'); 
    } 
}) 
.then((res) => { 
    // executed only when the condition is true 
    console.log(res) 
}) 
.catch(error => { 
    console.log(error.message); 
}) 

演示 - https://jsbin.com/ludoxifobe/edit?js,console

+0

有沒有其他辦法可以阻止它?因爲我在else塊中的代碼不應該是'error' – vincentf

+1

@vincentf是的,'返回Promise.reject('some messeage or not');'in else。 –

-6

就使用這樣的:拒絕(「拒絕」) 第一個任務的人。

P 
.then((res) => { 
    if(true) { 
     return res + 2 
    } else { 
     reject('rejected due to logic failure' } 
}) 
.then((res) => { 
    // executed only when the condition is true 
    console.log(res) 
}) 

或者ü還可以添加一個catch部分UR的第一項任務與.catch() 希望這有助於。

+4

'reject'在這裏不會被定義,因爲它僅在新的Promise上下文中可用這不起作用,並且將它拉出到變量之外的變量範圍似乎非常不承諾。 – jas7457

+3

不僅沒有定義,解決方案是錯誤的。在調用其中一個之後,其他調用「resolve」或「reject」(對於相同的承諾)將被忽略。 – traktor53

0

您可以閱讀the documentation,它說

Promise.then如果輸入函數拋出一個錯誤或輸入時返回被拒絕的Promise函數返回被拒絕的Promise。

如果你願意,你可以閱讀Promise A spec,在部分約then,其中promise2是指所產生的承諾:

如果任onFulfilledonRejected拋出一個異常epromise2必須被拒絕以e爲原因)。

如果您願意,您可以閱讀優秀的2ality blog

then()返回一個新的承諾Q(經由接收器的構造創建): 如果任一反應的返回一個值,Q與它解決。 如果其中任何一個反應拋出異常,Q就會被拒絕。

你能讀懂的輝煌YDKJS

無論是那麼(..)調用的履行或拒絕處理程序中拋出的異常會導致下(鏈)的承諾,立即與拒絕例外。