resolve一個promise時候發生了什麼

         此次單講resolve(promise)這種狀況。有些地方說"resolve(promise)返回了一個promise的副本"。這句話應該怎麼理解呢?咱們來看一個小例子:     promise

var p1= new Promise(function(resolve,reject){
setTimeout(function(){

resolve("ok")
},2000)
})
var p2= new Promise(function(resolve,reject){
resolve(p1) //resolve了一個promise
})

p2.then(
function(res){
console.log(res) //「ok"
})
console.log(p1) //Promise { <pending> }
console.log(p2) //Promise { <pending> }

          resolve(value),當value等於普通值,res就等於這個值, 而value若是等於p1,程序就會等待p1變成resolved後再往下執行。因此resolve(p1)等待p1的狀態改變(resolved或者rejected)再執行p2.then裏的回調。注意,這裏說」等待「,而不是」去執行「,由於p1是在定義時候自執行的,而不是resolve(p1)驅動的。這段代碼執行順序以下:異步

         1. new Promise同時就執行了resolve("ok"),這是個異步操做,程序繼續往下執行;函數

         2. new Promise 獲得p2, 執行到resolve(p1),異步操做,並且p1仍是pending狀態(2000ms沒有到),不能resolve p2,繼續執行spa

         3. 到了console.log(p1),這時候p1仍是pending,輸出 Promise(<pending>)code

         4. p2的狀態取決於p1,則輸出Promise(<pending>)blog

         5. 2000ms時間到,p1變成resolved,緊接着p2變成resolved,回調函數

         6. 執行p2.then回調函數,輸出"ok"io

         就上面這個簡單的例子來講,它也能夠這樣寫:console

```
var p2 = Promise.resolve(p1)
```

         從這個表達式能夠一目瞭然,p2就是p1的一個副本,由於p2的狀態(pending,resolved,rejected)取決於p1,p2裏沒有對p1進行其它的操做,則p2裏的操做和p1也一致。function

相關文章
相關標籤/搜索