2016-12-29 32 views
0

我正在尋找一種技術,以放棄承諾鏈(或完成()或類似的東西 - 某種終端方法)上的最後一個catch()而不必維護一個「完成」的狀態變量和一個假的完成()承諾我現在正在使用,需要在每次捕獲之後檢查狀態變量,並且拋出(再次)拋出finished()。這個過程將更容易閱讀和維護在某種「下降到最後的捕獲」方法鏈。目前我正在使用直接ES6,但其他庫將受到感謝。需要休息或完成在承諾鏈中的JavaScript

總之我怎麼做到這一點?:

begin() // some promise method 
.then() 
.then(/* found out I'm done here - break out or drop to last then() */) 
.then() 
.then() 
.catch() 
+0

如果你的第二個'then'返回一個Promise,當你發現你沒做完? –

+0

不是一個有用的。 –

回答

0

你不應該只是能夠返回一個拒絕承諾打出來的諾言鏈。

begin() 
    .then(() => { 
    if (/*we're done*/) { 
     return Promise.reject('some reason'); 
    } 
    }) 
    .then() // won't be called 
    .catch() // Catch 'some reason' 
2

您可以從拋出一個異常,那麼履行職能

var p = Promise.resolve(); 
 

 
p.then(() => console.log(1)) 
 
.then(() => { console.log(2); throw 'Oh no!'; }) 
 
.then(() => console.log(3)) 
 
.catch(error => console.log(error));

,或者返回一個拒絕承諾

var p = Promise.resolve(); 
 

 
p.then(() => console.log(1)) 
 
.then(() => { console.log(2); return Promise.reject('Oh no!'); }) 
 
.then(() => console.log(3)) 
 
.catch((error) => console.log(error));

+0

是的。我們考慮了一個「DONE」異常,但我想確保在使用異常作爲正常的控制流機制之前,我沒有遺漏一些基本的東西。 –

+0

如果在未完成時提供承諾對象,則可以在第二個'then(...)'內繼續流程。 是的,這意味着將其餘的'then()'調用嵌套在我的書中完全沒問題 –