Promise怎么跳出then到最后的finally?
发布于 6 年前 作者 IceEnd 27897 次浏览 最后一次编辑是 5 年前 来自 问答

通常使用Promise,都是按照。 .then() .then() .finally(); 下一步的then需要根据上一个then的结构来执行,但是有时候上一部返回了一个结果,告诉我们以后的then都不用再去执行,直接跳到finally,我查了文档没有找到这种方法。请问有这种写法或者是方法吗?

13 回复

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块中业务逻辑会有点多

@Neil-UWA 不建议这么做,这样有时候会屏蔽了真正的错误 From Noder

每次看到被promise then折腾的人们,我都问为什么不用co yield

最近用 node 比较多,参见下面的代码,在需要处理 reject 的地方添加 catch 处理,rejectcatch中间的 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.
回到顶部