javascript 和承诺:如何 refactor/flatten 以下嵌套承诺?

javascript and promise: how to refactor/flatten the following nested promises?

我是新手promise,正在看一段比较难看懂的代码:

  return promise
    .then(function helper0(instances) {
      return helper1(instances, options)
        .then(function helper2() {
            return bluebird.delay(3000)
              .then(function helper3() {
                return helper4(localParams, options);
              });
          }
        });
    });

如何将其重构为 promise.then().then()...?谢谢

嵌套 promise 是 known anti-pattern,您应该将它们链接起来:

// the structure is vertical instead of a nested pyramid
return promise
  .then(function helper0(instances) {
    return helper1(instances, options)
  })
  .then(function helper2() {
    return bluebird.delay(3000);
  })
  .then(function helper3() {
    return helper4(localParams, options);
  });

从传递给 then 的回调中返回一个承诺,将该承诺添加到链中。

使用 arrow functions 可以进一步清理:

return promise
  .then(instances => helper1(instances, options))
  .then(() =>  bluebird.delay(3000))
  .then(() =>  helper4(localParams, options);

但请注意,使用命名函数将是更好的调试方法,因为堆栈跟踪更具可读性。

假设您的函数也使用 Bluebird 承诺,您可以链接您的承诺,而不是像这样嵌套它们:

return promise.then(function helper0(instances) {
    return helper1(instances, options).delay(3000);
}).then(function helper3() {
    return helper4(localParams, options);
});

如果 helperX() 函数不一定 returning Bluebird 承诺,那么您可以这样做:

return promise.then(function helper0(instances) {
    return helper1(instances, options);
}).then(function() {
    return Bluebird.delay(3000);
}).then(function helper3() {
    return helper4(localParams, options);
});

当您从 .then() 处理程序中 return 承诺时,会将承诺插入链中,链的其余部分等待该承诺完成,然后链继续进行。这使您可以像这样链接而不是嵌套所有内容。