我如何打破承诺链?

时间:2017-05-04 00:54:51

标签: javascript

在这种情况下,如何停止承诺链? 只有当第一个条件为真时才执行第二个代码。

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)
})

4 个答案:

答案 0 :(得分:7)

您可以在dat_readdates = cDate(var_readdates) 块中throw Error,然后在承诺链的末尾else

catch

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

答案 1 :(得分:0)

您可以阅读the documentation,其中包含

  如果输入函数抛出错误,或者输入函数返回被拒绝的Promise,则

Promise.then返回被拒绝的Promise。

如果您愿意,可以在关于then的部分中阅读Promise A spec,其中promise2指的是最终的承诺:

  

如果onFulfilledonRejected引发异常e,则必须拒绝promise2,并以e为理由。)

如果您愿意,可以阅读优秀的2ality blog

  

then()返回一个新的promise Q(通过接收者的构造函数创建):   如果任何一个反应返回一个值,Q就会被解析。   如果任何一个反应抛出异常,Q就会被拒绝。

你可以阅读精彩的YDKJS

  

在then(..)调用的实现或拒绝处理程序中抛出异常会导致下一个(链式)承诺立即被该异常拒绝。

答案 2 :(得分:0)

您可以将链移动到条件分支中:

p.then((res) => {
  if(true) {
    return Promise.resolve(res + 2).then((res) => {
      // executed only when the condition is true
    });
  } else {
    // do something 
    // chain ends here
  }
});

答案 3 :(得分:-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()为你的第一个任务添加一个catch部分 希望这会有所帮助。