我正在學習javascript中的承諾,我決定實現(xiàn)一個簡單的承諾,我將設置一個3秒的超時,然后拒絕這個承諾。在拒絕它時,我捕捉到了錯誤并將其顯示在HTML元素中。promise完美地工作并顯示消息,但是我在控制臺中得到以下錯誤。
Uncaught (in promise) I hate you
Promise.then (async)
(anonymous)
以下是代碼供您參考-
const myPromise = new Promise(function(myResolve, reject) {
setTimeout(() => {
reject('I hate you');
}, 3000);
});
myPromise.then(function(value) {
document.getElementById("demo").innerHTML = value;
});
myPromise.catch( error => {
console.log("Catching it");
document.getElementById("demo").innerHTML = error;
});
<h2>JavaScript Promise</h2>
<p>Wait 3 seconds (3000 milliseconds) for this page to change.</p>
<h1 id="demo"></h1>
您需要在之后捕捉錯誤。然后
這應該行得通
<html>
<body>
<h2>JavaScript Promise</h2>
<p>Wait 3 seconds (3000 milliseconds) for this page to change.</p>
<h1 id="demo"></h1>
<script>
const myPromise = new Promise(function(myResolve, reject) {
setTimeout(() => {
reject('I hate you');
}, 3000);
});
myPromise.then(function(value) {
document.getElementById("demo").innerHTML = value;
}).catch(error => {
console.log("Catching it");
document.getElementById("demo").innerHTML = error;
});
</script>
</body>
</html>
更新
感謝tlvi38對已接受答案的評論,我現(xiàn)在理解了我的疑問,OP發(fā)布的原始問題中未捕獲的問題可以通過為unchained then返回的新承諾添加單獨的catch塊來修復,如下所示:
const myPromise = new Promise(function (myResolve, reject) {
setTimeout(() => {
reject("I hate you");
}, 500);
});
const newUncaughtPromise = myPromise.then(function (value) {
document.getElementById("demo").innerHTML = value;
});
myPromise.catch((error) => {
console.log("Catching it");
document.getElementById("demo").innerHTML = error;
});
newUncaughtPromise.catch((error) => {
console.log("Catching the uncaught it");
document.getElementById("demo_uncaught").innerHTML = error;
});
原創(chuàng) 因為我不能添加評論,所以我寫這篇文章作為回答,但是我觀察到除了可接受的回答之外,如果你有像下面這樣的catch塊,它也可以工作,沒有任何問題。
const myPromise = new Promise(function(myResolve, reject) {
setTimeout(() => {
reject('I hate you');
}, 3000);
});
myPromise.catch( error => {
console.log("Catching it");
document.getElementById("demo").innerHTML = error;
});
但是如果兩者都有,那么和catch沒有以任何順序鏈接起來,就會產(chǎn)生無法捕獲的錯誤..在控制臺中。有人能解釋一下為什么嗎?