如何链接 javascript 承诺和错误

how to chain javascript promises and errors

假设:

function f() {
  return p1()
    .then(function(p1res) {
       console.log('p1 ok');
       return Promise.resolve(p1res);
    }, function(err) {
       console.log('p1 err '+err);
       return Promise.reject(err);

    }).then( ... proceed

是语句

return Promise.resolve(p1res);

return Promise.reject(err);

需要吗?

Are the statements return Promise.resolve(p1res); and return Promise.reject(err); needed?

是的,需要这个或类似的东西如果您计划从这些处理程序中链接额外的 then 处理程序,因此需要保留 ("pass through")承诺的价值和地位。但是,即使你打算这样做:

  1. 而不是 return Promise.resolve(p1res); 它会更简单,相当于只说 return p1res;.

  2. 而不是 return Promise.reject(err); 会更简单,相当于只说 throw err;,用 "reason" [=18 继续错误路径上的承诺=].

但是,如果您的目标只是让一个处理程序记录状态,则您不需要,也可能不想,从那里链接后续处理程序,因为这会增加您的麻烦确保状态报告处理程序 return 值或为了下游处理程序的利益重新抛出错误。相反,您可以将状态报告处理程序放在单独的 "branch" 上,而不用担心它们 return 或通过什么:

function f() {
  let result = p1();

  result . then(
      function(p1res) { console.log('p1 ok'); }, 
      function(err)   { console.log('p1 err ', err); });

  result . then(
    ...proceed