链式promise函数中,如何判断是哪个promise抛出的错误

我需要实现在一个链式promise函数中,中间的任何一个函数错误则程序终止,并且能捕获到出错函数,然后根据不同的出错函数执行不同的操作。如下代码则该如何改进?

请勿在error对象中带信息

function f1(){
    return new Promise((resolve,reject) =>{
        setTimeout(() =>{
            reject("err");
        },1000)
    })
}

function f2(){
    return new Promise((resolve,reject) =>{
        setTimeout(() =>{
            reject("err");
        },1000)
    })
}

function f3(){
    return new Promise((resolve,reject) =>{
        setTimeout(() =>{
            reject("err");
        },1000)
    })
}

const foo = () =>{
    return f1().then(() =>{
        return f2();
    }).then(() =>{
        return f3();
    }).catch(err =>{
        // 如何判断这个错误是哪个函数抛出的??
        return err;
    })
} 

foo();

假如是每一个函数都是向后端发送异步请求,而后端返回的数据格式一定是固定的,也就是说我们不能根据后端返回的数据去判断是哪个函数抛出了错误。该怎么办??

谢谢各位帮忙!

阅读 3.4k
4 个回答

reject里放有用的信息啊 下一步做什么可以放到reject里

function f1(){
    return new Promise((resolve,reject) =>{
        setTimeout(() =>{
            reject("err1");
        },1000)
    })
}

function f2(){
    return new Promise((resolve,reject) =>{
        setTimeout(() =>{
            reject("err2");
        },1000)
    })
}

function f3(){
    return new Promise((resolve,reject) =>{
        setTimeout(() =>{
            reject("err3");
        },1000)
    })
}

const foo = () =>{
    return f1().then(() =>{
        return f2();
    }).then(() =>{
        return f3();
    }).catch(err =>{
        // 如何判断这个错误是哪个函数抛出的??
        console.log(err);
        return err;
    })
} 

foo();

两种方法吧

  1. reject抛出的Error对象带有信息

    function f1(){
        return new Promise((resolve,reject) =>{
            setTimeout(() =>{
                reject(new Error("f1 err"));
            },1000)
        })
    }
  2. 在每一个then方法的第二个参数函数里输出错误信息

    f1().then(() =>{
        return f2();
    },()=>{
        throw Error("f1 err");
    })

更新

现在更新估计题主也不再关心答案了,只是单纯的探讨下写法。

const foo = async () =>{
    const f1Result = await f1().catch(()=>{
        return false
    })
    if(!f1Result){
        console.error('f1 err!')
        return
    }
    
    
    const f2Result = await f2().catch(()=>{
        return false
    })
    if(!f2Result){
        console.error('f2 err!')
        return
    }
    
    
    const f3Result = await f3().catch(()=>{
        return false
    })
    if(!f3Result){
        console.error('f3 err!')
        return
    }
} 

foo();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题