我正在寻找一种技术来放弃承诺链上的最后一个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()
答案 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);
})