如何处理JavaScript Promise中多个then的错误?

7
让 p 成为我们可以实现的承诺。
p
.then(f1)
.then(f2)
.then(f3)
.catch(f4)

现在,在catch中,错误可以从f1、f2、f3甚至p rejected中抛出。

现在,在f4(或catch中)处理错误的适当方式是什么,因为上面抛出的错误可能是不同类型的,是否可以避免在f4中使用多个if else?

3个回答

3
您可以定义自己的自定义错误。例如:
function CustomError(errorText){
    this.error = errorText;
}

修改你的函数。为每个返回的 Promise 添加 catch 块:

function p(){
    return new Promise(function(resolve, reject){ 
            //Your functionality here
         })
          .catch(function(error){
             Promise.reject(new CustomError('f1')));
         })
}

等等:f2、f3、f4

你的捕获块将是:

.catch((err) => {
    if(err instanceof CustomError){
        HandleCustomError(err);
    } else {
        //Some another error is happen
    }
 })

您的自定义错误处理程序将类似于以下内容:
function HandleCustomError(customError){
     switch(customError.error){
         case 'f1':
            //handle f1
            break;
         case 'f2':
            //handle f2
            break;
         ...
     }
}

1
只需定义一个额外的 catch 回调函数:
p
.then(f1)
.then(f2)
.then(f3)
.catch(err => {
  if (/* is expected error */) {
    console.log(err);
    return;
  }
  throw new Error('Unexpected error');
})
.catch(err => ...)

1
通过捕获被拒绝的Promise中的错误,您就不需要担心最终catch块中的不同类型的错误,您的代码应该变得更易读(从而更容易看到每个catch块处理适当的拒绝)。
我还建议,如果在您的情况下可能的话,请使用async/await。 在这种语法中,被拒绝的promise等同于抛出的错误。 与使用大量链接的Promises不同,“每个catch块处于正确位置”的逻辑更直接,应该更容易发现错误。
try {
  const v1 = await f1();
} catch (err) {
  // Process err
}

try {
  const v2 = await f2(v1);
} catch (err) {
  // Process err
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接