解决承诺捕获块中

时间:2018-07-17 12:51:17

标签: javascript promise

我在一些代码中发现了这一点。是否有充分的理由这样做?

}).catch(() => {
  resolve();
});

我很好奇是否有任何可行的方法可以做到这一点,但是在这种情况下,我正在检查的代码是:

function checkExtendedPackage(config, packagePath) {
  return new Promise((resolve, reject) => {
    extend.check(packagePath)
      .then(() => {
        extend.validate(packagePath, config.allowExtends, config.scope)
          .then(packageToExtend => {
            showOutput.log([{
              type: 'success',
              description: 'validating',
              message: packageToExtend
            }]);
            resolve();
          }).catch(err => {
            reject(err);
          });
      }).catch(() => {
        resolve();
      });
  });
}

1 个答案:

答案 0 :(得分:1)

您似乎已经猜到了,那只是写得不好的代码。您最初指出的部分并没有什么好处,它的确是explicit promise construction antipattern的一个示例。它似乎是由一个不太了解如何使用诺言的人写的。

可以这样改进:

function checkExtendedPackage(config, packagePath) {
    return extend.check(packagePath)
        .then(() => extend.validate(packagePath, config.allowExtends, config.scope)
            .then(packageToExtend => {
                showOutput.log([{
                    type: 'success',
                    description: 'validating',
                    message: packageToExtend
                }]);
            })
        , () => null);
}

与原始代码一样,此函数将返回以下承诺:

  • 如果extend.check拒绝(在这种情况下解析为null),则不会拒绝
  • 如果extend.validate拒绝(具有相同错误)将拒绝
  • 如果两个都成功,将使用必要的值执行showOutput.log

为减少嵌套和复杂性,我建议将其分为两个功能:

function validateAndLogExtendedPackage(config, packagePath) {
    return extend.validate(packagePath, config.allowExtends, config.scope)
        .then(packageToExtend => {
            showOutput.log([{
                type: 'success',
                description: 'validating',
                message: packageToExtend
            }]);
        });
}

function checkExtendedPackage(config, packagePath) {
    return extend.check(packagePath)
        .then(
            () => validateAndLogExtendedPackage(config, packagePath),
            () => null
        );
}