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

相关文章
相关标签/搜索