2017-02-25 89 views
10

一旦承諾reject()回調被調用,警告消息「未捕獲(承諾)」出現在Chrome控制檯中。我無法圍繞它背後的原因,也不知道如何擺脫它。Promise拒絕()導致「未捕獲(承諾)」警告

var p = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    var isItFulfilled = false 
    isItFulfilled ? resolve('!Resolved') : reject('!Rejected') 
    }, 1000) 
}) 

p.then(result => console.log(result)) 
p.catch(error => console.log(error)) 

警告:

enter image description here

編輯:

我發現,如果onRejected處理程序未明確提供給.then(onResolved, onRejected)方法,JS會自動提供一個隱含的一個。它看起來像這樣:(err) => throw err。自動生成的處理程序將輪到它。

參考:

如果IsCallable(onRejected)`是,然後
     讓onRejected是 「運動員」。

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen

回答

8

這是因爲你沒有一個catch處理程序附加到第一then方法,它因此,是沒有處理程序時的承諾,拒絕返回的承諾。你有一個爲承諾p在最後一行,但不是爲鏈接承諾,由then方法返回,在行之前。

正如您在下面的註釋中正確添加的,當沒有提供捕捉處理程序(或它不是函數)時,該錯誤爲default one will throw。在承諾鏈中,這個錯誤可以通過catch方法回調找到,但如果沒有,JavaScript引擎將處理類似於任何其他未捕獲錯誤的錯誤,並在這種情況下應用默認處理程序,結果在你看到的輸出中。

爲了避免這種情況,鏈.catch方法由第一then返回,這樣的承諾:

p.then(result => console.log('Fulfilled')) 
.catch(error => console.log(error)); 
+0

謝謝trincot。我做了一些額外的研究,發現如果onRejected處理程序沒有明確地通過,JS將提供一個隱含的: '如果IsCallable(onRejected)'爲** false **,則 讓'onRejected'爲** ** Thrower **」。 看起來像這樣:'arg => throw arg' 一個空的onRejected句柄'()=> {}'可以覆蓋這種行爲。但是'null'不會。 _ref:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen_ –

+0

不客氣,對EcmaScript規範有很好的參考!爲了完整起見,我將其添加到了我的答案中。大! – trincot

+0

@trincot我把它鏈接了起來,它仍然給我未被捕獲的錯誤信息 –