2016-04-09 21 views
5

如果承諾被拒絕,我不想做任何事情,如getPromise().then(foo=>{});。爲什麼在Chrome上出現錯誤?爲什麼忽略Chrome上被拒絕的承諾是錯誤的?

(new Promise((resolve, reject)=>{reject()})) 
Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: undefined} 
VM3250:2 Uncaught (in promise) undefined 

在Node和Firefox上,可以忽略被拒絕的部分。

回答

2

承諾拒絕就像未捕獲的異常。 如果你想忽略例外 - 捕捉它,但不處理, 同樣在這裏 - 添加.catch說法,但什麼都不做

Promise.reject(new Error('bad..')).catch(e => {})

我不會然而建議,作爲承諾拒絕的理由,所以你可能想添加某種處理邏輯

1

拒絕承諾基本上意味着發生了一些不好的事情,並且您應該通過致電catch來處理它。如果你拒絕一個承諾,而不必一個catch,它會拋出一個異常(更準確地,未處理的拒絕)

var a = (new Promise((resolve, reject) => { 
    reject("my error") 
})).catch((err) => { 
    console.error(err) 
}) 

我猜這是V8的特殊性,如果發生這種情況只有在瀏覽器,但它使我感覺

3

如果沒有承諾拒絕處理程序,chrome會拋出拒絕的原因異步不影響任何JavaScript進程,只是打印原因控制檯。如果您對此感到惱火,則需要添加處理程序,例如Promise.reject(reason).catch(reason => {})

更新:爲什麼是錯誤?這可能是因爲拒絕傳統上被認爲是一種例外(錯誤)。

P.S.你的「問題」看起來像一個反饋,而不是一個問題。我個人更喜歡將原因視爲錯誤。

+0

當我在extension,content-script中使用'Promise'時,這個異常會產生影響。整個擴展中斷只有一行消息:'未捕獲(承諾)未定義' – Zen