Q:Promise Chaining and Rejection:reject 不会杀死链吗?

Q: Promise Chaining and Rejection: Doesn't reject kill the chain?

我有以下所有使用 Q 实现承诺的链式函数:

validateToken(context).then(parseFormData, get403).then(createReport, get400).then(send200, get400).catch(get500);

例如他们都有自己的地方:

let deferred = q.defer();
..
deferred.resolve(true);
deferred.reject(false);
return deferred.promise;

第一个函数validateToken调用了deferred.reject。这会导致 get403 被调用,正如预期的那样;但是 createReport、get400 和 get500 也被调用了?这让我很困惑。我以为链中只有第一个错误处理程序被命中了?

有人可以解释一下发生了什么吗?如果我有办法在只调用最直接的 reject/error 处理程序的情况下获得所需的行为?

那要看什么on403 returns。如果没有,则假定它是一个解决方案 - 这解释了您所看到的行为。请记住,onReject 等同于 catch,作为一个概念, 允许您继续处理,就好像没有发生错误一样

如果您想继续沿着拒绝链进行下去,那么您必须 return Promise.reject()。否则你必须重新考虑你的承诺链。