我想知道在es2015中使用promise链时,是否有可能将多个相同的catch块重构为一个catch块。
请参阅以下承诺链(并不重要):
replace(replaceOptions(dirPath + '/' + jsName))
.then((changes) => {
fileModifiedPrint(changes);
removeDocumentation(jsName, dirPath, dirName);
replace(replaceHTMLID(dirPath + '/' + jsName))
.then((changes) => {
})
.catch((err) => {
fileErrorPrint(jsName, dirPath, err, "write"); return;
})
})
.catch((err) => {
fileErrorPrint(jsName, dirPath, err, "write"); return;
})
我可以将这两个catch块合并为一个吗?
答案 0 :(得分:3)
是否可以组合多个相同的捕获块?
是的,如果您通过从.then()
处理程序中返回内部承诺来链接您的承诺,然后让拒绝传播冒泡到单个.catch()
块,则可以:
replace(replaceOptions(dirPath + '/' + jsName)).then((changes) => {
fileModifiedPrint(changes);
removeDocumentation(jsName, dirPath, dirName);
// return this promise to chain it to the parent promise
return replace(replaceHTMLID(dirPath + '/' + jsName)).then((changes) => {
// do whatever you want here
});
}).catch((err) => {
// this will catch any rejection anywhere in the promise chain
// that wasn't already caught by someone
fileErrorPrint(jsName, dirPath, err, "write");
});
当你链接promises时,被拒绝的promise会传回到链接到它遇到的链中的第一个.catch()
处理程序。如果在顶级之前没有.catch()
处理程序,那么它将一直到.catch()
。这允许您在本地处理拒绝和"隐藏"它来自链的其余部分,或者让它通过让它传播而拒绝整个链。您可以根据您的特定情况最适合实现任何类型的逻辑。
仅供参考,您也可以将内容.then()
上的replace()
取消嵌套:
replace(replaceOptions(dirPath + '/' + jsName)).then((changes) => {
fileModifiedPrint(changes);
removeDocumentation(jsName, dirPath, dirName);
// return this promise to chain it to the parent promise
return replace(replaceHTMLID(dirPath + '/' + jsName));
}).then((changes) => {
// results of the second `replace()` call.
// do whatever you want here
}).catch((err) => {
// this will catch any rejection anywhere in the promise chain
// that wasn't already caught by someone
fileErrorPrint(jsName, dirPath, err, "write");
});
答案 1 :(得分:-2)
有点。
当您调用.catch((err) => { /*error catching*/ })
时,您正在指定一个回调函数,如果发生错误将调用该函数。因为您使用相同的代码来捕获错误,所以您可以创建一个函数并将其传递给catch:
const errorCallback = function(err) { fileErrorPrint(jsName, dirPath, err, "write"); }
replace(replaceOptions(dirPath + '/' + jsName))
.then((changes) => {
fileModifiedPrint(changes);
removeDocumentation(jsName, dirPath, dirName);
replace(replaceHTMLID(dirPath + '/' + jsName))
.then((changes) => {
})
.catch(errorCallback);
})
.catch(errorCallback);