是否可以组合多个相同的捕获块?

时间:2018-02-14 01:30:00

标签: javascript syntax ecmascript-6 promise

我想知道在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块合并为一个吗?

2 个答案:

答案 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);