2015-01-05 88 views
0

從Chrome中的控制檯,我使用原生JS的承諾,它是越來越自動解決,的Javascript承諾 - 解決(或)拒絕發生隱含

var p = new Promise(
    function(resolve, reject){ 
    resolve(200) 
}) 

回報

undefined 

p.then(function(response){ 
    console.log(response) 
}) 

回報

200 

我認爲,Promise.then是爲了註冊解析(或)拒絕回調。但是,在這種情況下,它爲什麼會觸發解析回調函數本身。

+0

不要被控制檯報告「未定義」混淆。明確檢查'p'的值,你會發現它已經是一個已經解決的承諾(在它被創建的時刻)。 –

回答

2

爲什麼記錄未定義?

因爲var語句沒有用的返回值。例如,如果您輸入var x = 5,則控制檯將記錄undefined

爲什麼解決?

因爲你叫resolve這就是你如何解決承諾構造函數的承諾。

var p = new Promise(function(resolve, reject){ 
    resolve(200) 
}); 

基本上與var p = Promise.resolve(200)一樣。這不僅是明確地解決它 - 它是解決它的唯一方法。如果您不想解決問題,請刪除resolve(200)行。

但是,在這種情況下,它爲什麼會觸發解析回調函數本身。

這不是,如果你console.log(p)和刪除then部分它將記錄一個已解決的承諾。

1

在這裏,如何&何時解決承諾觸發發生?

then回調在event loop的一些未來的下一回合執行,如果承諾結算前,它連接。如果在解決問題後附加它,它將在下一回閤中執行,就好像它被包裝在setTimeout(function() {}, 0)呼叫中一樣。

atleast在我的2行代碼中,我沒有明確解決它?

當您撥打resolve,是的,你正在解決承諾。

+0

剛剛改寫了最後一句話...... –

+0

它記錄了將在解決承諾時調用的回調函數,或者在已解析的情況下儘快提供回調函數。回調「保證運行」。如果你使用jQuery,就像'$(document).ready';它稍後運行,或者現在運行。 – Jackson