resolve一個promise時候發生了什么


         這次單講resolve(promise)這種情況。有些地方說"resolve(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,繼續執行

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

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

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

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

         就上面這個簡單的例子來說,它也可以這樣寫:

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

         從這個表達式可以一目了然,p2就是p1的一個副本,因為p2的狀態(pending,resolved,rejected)取決於p1,p2里沒有對p1進行其它的操作,則p2里的操作和p1也一致。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM