亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Promise,為什么瀏覽器會返回拒絕兩次而不是解決兩次?

使用 Promise,為什么瀏覽器會返回拒絕兩次而不是解決兩次?

qq_遁去的一_1 2021-11-12 18:20:10
我在理解 javaScript 時遇到問題promises。我寫了以下代碼:var p = new Promise(function(resolve,reject){    reject(Error("hello world"));});setTimeout(()=>p.catch(e=>console.log(e)),5000);我立即在 Chrome 開發者控制臺中看到了這一點:但是在我等待 5 秒鐘后,消息會自動變為黑色,如下圖所示:我以前從未在我的 javaScript 代碼和開發人員控制臺之間看到過這種行為,我的 javaScript 代碼可以在開發人員控制臺中“修改現有內容”。所以我決定resolve通過編寫以下代碼來看看是否會發生同樣的情況:var p = new Promise(function(resolve,reject){    resolve("hello world");});setTimeout(()=>p.then(e=>console.log(e)),5000);但是在這種情況下,我的開發人員控制臺直到 5 秒后才顯示任何內容,然后將hello world.為什么resolve和reject被調用的時間如此不同?額外的我也寫了這段代碼:var p = new Promise(function(resolve,reject){    reject(Error("hello world"));});setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);setTimeout(()=>p.catch(null),7000);這會導致多個輸出到開發人員控制臺。在時間 0 時出現紅色錯誤,在 5 秒時紅色變為黑色并帶有文本errors hello world,然后在 6 秒時出現新的錯誤消息errors 2 hello world,然后在 7 秒時出現紅色錯誤消息。現在我對reject實際調用了多少次感到非常困惑......我迷路了......
查看完整描述

1 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

哇,這真的很酷。我以前從未見過控制臺這樣做。(不過,它還有其他形式的動態行為,所以......)這是發生了什么:

在第一種情況下,setTimeout回調代碼之外的所有代碼執行完成,執行堆棧返回,因此只有“平臺代碼”(如 Promises/A+ 規范所稱)正在運行,而不是用戶級 JavaScript 代碼(目前)。此時,promise 被拒絕并且沒有任何東西處理拒絕,所以這是一個未處理的拒絕,devtools 將它報告給你。

然后,五秒鐘后,您的回調運行并附加一個拒絕處理程序。此時,拒絕不再是未處理的。顯然,Chrome/V8/devtools 協同工作以從控制臺刪除未處理的拒絕警告。相反,您看到的是您在拒絕處理程序中通過console.log. 如果您早點附加拒絕處理程序,您就不會得到未處理的拒絕錯誤。

這不會發生在履行中,因為不處理履行不是錯誤條件。不處理拒絕是。


查看完整回答
反對 回復 2021-11-12
  • 1 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號