当你用一个变量接收一个new promise对象时,对象构造函数中的方法会立刻执行,
比如
var p1 = new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('执行P1');
resolve('P1返回值');
}, 2000);
})
var p2 = new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('执行P2');
resolve('P2返回值');
}, 1000);
})
p1.then((ret)=>{
console.log(ret);
return p2;
}).then((ret)=>{
console.log(ret);
})
执行上述代码,你会发现P1P2同时执行了,而且先打印的P2执行,但是返回值的打印顺序是对的。
我们可能希望去序列化执行P1P2,等P1执行完了,打印P1返回值,再到P2执行完了,打印P2返回值。
我们只需要简单的改变一下P1/P2的声明方式,将new Promise 语句产生的对象封装一个函数并返回去,再.then的时候再执行就可以了。如下:
var p1 = function(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('执行P1');
resolve('P1返回值');
}, 2000);
})
}
var p2 = function(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('执行P2');
resolve('P2返回值');
}, 1000);
})
}
p1().then((ret)=>{
console.log(ret);
return p2();
}).then((ret)=>{
console.log(ret);
})
打印结果如下图