2017-10-13 37 views
0

我對承諾的使用有點困惑。 請看下面的例子:我怎麼能捕獲該異常,當我使用promise.all []或停止鏈通話

Q1。我怎樣才能停止連鎖電話?

const wait = (duration = 0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
Promise.resolve() 
 
    .then(() => { 
 
    asyncTask1(); 
 
    }) 
 
    .then(() => { 
 
    asyncTask2(); 
 
    }) 
 
    .catch(() => { 
 
    console.log('fail.'); 
 
    });

正如代碼所示,asyncTask2不會運行,直到asyncTask1已完成。但問題是,如果asyncTask1失敗,我怎麼能阻止連鎖電話。即asyncTask2將無法​​運行,因爲asyncTask1失敗 。 注:未在asyncTask1產生錯誤或異常,我想用一個狀態(成功或失敗)決定asyncTask1的結果。

Q2。當我使用Promise.all()時,如何知道哪個任務會生成異常?

const wait = (duration=0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
Promise 
 
    .all([asyncTask2(), asyncTask1()]) 
 
    .then(() => { 
 
    console.log('all done.'); 
 
    }) 
 
    .catch((e) => { 
 
    console.log('error'); 
 
    });

上面的代碼可以正常運行,但是如果asyncTask1asyncTask2失敗,它將進入捕捉功能。所以問題是我怎麼知道這個異常是從asyncTask1還是asyncTask2

+0

只是拋出一個獨特的誤差爲每則可以檢查錯誤以查看它是哪個錯誤。除此之外,使用'Promise.all()'時無法知道。它只報告第一次拒絕,沒有報告它是哪一個。 – jfriend00

+0

它可能感興趣你知道,'新Promise'執行函數有** 2個**參數...'新的承諾((解析,拒絕)=>拒絕(「嗒嗒」))'將拒絕承諾,而不是解決/履行它 –

+0

「*正如代碼所示,asyncTask2將不會運行,直到asyncTask1完成。*」 - 沒有。爲此,您需要將任務承諾從'then'回調中'返回,否則將不會在鏈中等待。 – Bergi

回答

0

您可以使用Array.prototype.map()撥打設置在一個陣列的功能,throw其中.map()回調中出現錯誤的元素的index.catch()

const wait = (duration=0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    throw new Error() 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
let arr = [asyncTask2, asyncTask1]; 
 

 
Promise 
 
    .all(arr.map((p, index) => 
 
    p().catch(err => {throw new Error(err + " at index " + index)}))) 
 
    .then(() => { 
 
    console.log('all done.'); 
 
    }) 
 
    .catch((e) => { 
 
    console.log('error', e); 
 
    });

相關問題