我在一些代码中发现了这一点。是否有充分的理由这样做?
}).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();
});
});
}
答案 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
);
}