在javascript中需要在Promise链中休息或完成

时间:2016-12-29 23:01:00

标签: javascript promise es6-promise

我正在寻找一种技术来放弃承诺链上的最后一个catch()(或者一个完成()或类似的东西 - 某种类型的终端方法)而不必维护一个&#34 ;完成"状态变量和伪造的()承诺我现在正在使用,需要在每次捕获后检查状态变量,并抛出(再次)抛出的finished()。这个过程将更容易阅读和维护在一个链中,某种类型的"下降到最后一个捕获"方法。目前我使用的是直接的ES6,但其他的库将会被认真考虑。

简而言之,我该怎么做?:

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

你不应该通过返回被拒绝的承诺来突破承诺链。

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

答案 2 :(得分:0)

我们可以借助抛出错误打破承诺链

function myFunction() {
       // our custom promise or some function return promise object
       return new Promise(function(resolve,reject){
          setTimeout(function(){
            resolve('dai')
          }, 2000)
       })
    }


myFunction().then(data=>{
    console.log('main')
}).then(data =>{
    console.log('one')
}).then(data =>{
    console.log('two')
    throw new Error('custom breaked')
}).then(data =>{
    console.log('three')
}).catch(err=>{
    console.log('---------error---------')
    console.log(err.message) // custom breaked
    res.status(500).send(err.message);
})