2016-12-29 34 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()'调用嵌套在我的书中完全没问题 –