什么是Promise
如何直观地理解Promise?
在油管上看到一个比较有趣的类比,可以把Promise看成是用手机打车的过程。
当司机收到新的订单时,一个新的Promise就创建了,此时乘客将在上车点等待司机,当司机到达或者临时取消订单时,司机会通过resolve或者reject来告知乘客,此时Promise就完成了,乘客可以上车(调用then函数)。
var callDriver = new Promise(function(resolve, reject) {//呼叫司机
setTimeout(() => resolve('抵达上车点'), 1000);//司机正在前往上车点的路上,耗时1000ms
}).then(function(result) {//收到司机的抵达信息
alert(result); // 抵达上车点
})
Promise链
通过Promise链可以实现一个接一个地执行异步任务。
当then处理程序返回一个普通值时,它将成为该 promise 的 result,所以将使用它调用下一个 .then
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // (*)
}).then(function(result) { // (**)
alert(result); // 1
return result * 2;
}).then(function(result) { // (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
then除了可以返回普通值外,还可以返回一个新的Promise对象,来构建异步行为链
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000);
}).then(function(result) {
alert(result); // 1
return new Promise((resolve, reject) => { // (*)
setTimeout(() => resolve(result * 2), 1000);
});
}).then(function(result) { // (**)
alert(result); // 2
return new Promise((resolve, reject) => {
setTimeout(() => resolve(result * 2), 1000);
});
}).then(function(result) {
alert(result); // 4
});
此时第一个then返回的Promise对象的resolve值在完成执行器函数(这里指setTimeout)后可以传递给下一个then,下一个then继续返回一个新的Promise,依次类推,此时输出与前面的示例相同:1 → 2 → 4,但是现在每次 alert 调用之间会有 1 秒钟的延迟,从而实现带有异步效果的Promise链。
查看更多细节可传送至:zh.javascript.info/promise-cha…