鍍金池/ 問答/HTML/ 鏈式promise函數(shù)中,如何判斷是哪個promise拋出的錯誤

鏈式promise函數(shù)中,如何判斷是哪個promise拋出的錯誤

我需要實現(xiàn)在一個鏈式promise函數(shù)中,中間的任何一個函數(shù)錯誤則程序終止,并且能捕獲到出錯函數(shù),然后根據(jù)不同的出錯函數(shù)執(zhí)行不同的操作。如下代碼則該如何改進?

請勿在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 =>{
        // 如何判斷這個錯誤是哪個函數(shù)拋出的??
        return err;
    })
} 

foo();

假如是每一個函數(shù)都是向后端發(fā)送異步請求,而后端返回的數(shù)據(jù)格式一定是固定的,也就是說我們不能根據(jù)后端返回的數(shù)據(jù)去判斷是哪個函數(shù)拋出了錯誤。該怎么辦??

謝謝各位幫忙!

回答
編輯回答
半心人

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

2017年3月10日 02:11
編輯回答
風畔

兩種方法吧

  1. reject拋出的Error對象帶有信息

    function f1(){
        return new Promise((resolve,reject) =>{
            setTimeout(() =>{
                reject(new Error("f1 err"));
            },1000)
        })
    }
  2. 在每一個then方法的第二個參數(shù)函數(shù)里輸出錯誤信息

    f1().then(() =>{
        return f2();
    },()=>{
        throw Error("f1 err");
    })
2018年7月20日 04:11
編輯回答
吢丕
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 =>{
        // 如何判斷這個錯誤是哪個函數(shù)拋出的??
        console.log(err);
        return err;
    })
} 

foo();
2017年10月25日 13:00