通常使用Promise,都是按照。 .then() .then() .finally(); 下一步的then需要根据上一个then的结构来执行,但是有时候上一部返回了一个结果,告诉我们以后的then都不用再去执行,直接跳到finally,我查了文档没有找到这种方法。请问有这种写法或者是方法吗?
then里面完成不就行了,非要到finally下。。。。。
@TimothyJin 我声明过后面的then有时不需要全部执行
其实你可以直接把你的结果reject掉,在catch中作判断是不是错误就好了,想直接跳出Promise链是不可能的 Promise.resolve().then(()=>{ if(needToContinueProcess) return xxx; return Promise.reject({final}) }) .then(processOne) .then(processTwo) .catch(err=>{ if(err instanceof Error) return handleError }) .finally() 另一种方法是使用generator
@Neil-UWA 如果结果是正确的,但是结果有几种情况,某种情况可能不再需要继续往下执行,这时候我抛错异常,下一个then里面会捕获异常,而下下个then还是会执行。既然不能跳出链,哪有什么写法可以处理这种情况吗。
@IceEnd 错误处理可以统一放到最后的catch里,不用每个promise都加个reject
@ncuzp 明白了,感谢
@IceEnd Promise 的定义里面 本来就没有finally 只有resolve 或者 reject,建议楼主看下
finally 这个是三方库支持的吧…
只能一条路走到黑!!!
@IceEnd 你没明白我的意思,上面reject的不是一个错误而是你的正确结果,所以要求你在最后的catch中做判断捕捉到的是异常还是说直接跳出后面的then。不过这样的话你的catch块中业务逻辑会有点多
每次看到被promise then折腾的人们,我都问为什么不用co yield
最近用 node
比较多,参见下面的代码,在需要处理 reject
的地方添加 catch
处理,reject
和 catch
中间的 then
被跳过,catch
后面的 then
继续处理;测试代码如下,node
版本 v4.4.3
var fn = (num) => {
return Promise.resolve().then(() => {
if (num >= 0) {
return Promise.resolve(num);
} else {
return Promise.reject(num);
}
}).then((value) => {
return value + 1;
}).then((value) => {
return value * 2;
}).catch((value) => {
if (value < -100) {
return Promise.reject(value); // 继续返回 reject 状态
} else {
return value * value; // 继续返回 resolve 状态
}
}).then((value) => {
console.log(`num = ${num}, value = ${value}.`);
});
};
fn(10);
fn(-10);
执行结果
num = 10, value = 22.
num = -10, value = 100.