• 概念

Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大,能优雅解决回调地狱难题。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件的结果。

Promise对象代表一个异步操作,有三种状态:Pending(进行中)Resolved(已完成)Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

  • 基本用法

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject

resolvePromise对象的状态从从Pending变为Resolved,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。

reject函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例生成以后,可以用then方法分别制定Resolved状态和Rejected状态的回调函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */) {
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// sucess
}, function(error) {
// failure
});
  • Promise新建后会立即执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const promise = new Promise(function(resolve, reject) {
console.log('promise');
resolve();
});
promise.then(function() {
console.log('resolve');
});
console.log('hi');
// promise
// hi
// resolve

上面代码中,new Promise后立即执行,先输出的是promisethen方法的回调函数将在当前脚本所有同步任务执行完才会执行,所以resolve最后输出。

  • 多任务并行处理

当多个异步任务没有依赖关系,且要等多个异步任务全部返回后才执行相应的回调函数,Promise也可以优雅的解决 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Promise.all([
new Promise(function(resolve, reject) {
setTimeout(() => {
resolve(1);
}, 1000);
}),
new Promise(function(resolve, reject) {
setTimeout(() => {
resolve(2);
}, 2000);
})
])
.then(function(results) {
console.log(results); // [1, 2]
});