1 概述
-
+
- 所谓
Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
+
1.1 Promise 对象特点
-
+
对象的状态不受外界影响。
+-
+
- Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 +
+-
+
-
+
Promise
对象的状态改变,只有两种可能:从pending
变为fulfilled
和从pending
变为rejected
。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved
(已定型)。(本章后面的resolved
统一只指fulfilled
状态,不包含rejected
状态。)
+
+ 无法取消
+Promise
,一旦新建它就会立即执行(可以封装它调用执行),无法中途取消。
+
1 | // 封装promise |
2 基本用法
2.1 创建 Promise 对象
-
+
Promise
构造函数接受一个函数作为参数,该函数的两个参数分别是resolve
和reject
。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
+
1 | const promise = new Promise(function(resolve, reject) { |
-
+
Promise
实例生成以后,可以用then
方法分别指定resolved
状态和rejected
状态的回调函数。这两个函数都接受Promise
对象传出的值作为参数。
+
1 | promise.then( |
2.2 执行顺序
-
+
Promise 新建后就会立即执行。
+
+
+then
方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行
+
1 | let promise = new Promise(function(resolve, reject) { |
2.3 example
-
+
- Promise + AJAX + JSON +
1 | const contanier = document.getElementById('contanier'); |
3 方法
3.1 实例方法
-
+
- Promise.prototype.then()
-
+
- then方法设置回调函数。 +
+ - Promise.prototype.catch()
-
+
romise.prototype.catch
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数。then
方法指定的回调函数,如果运行中抛出错误,也会被catch
方法捕获。如果没有使用catch
方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码。
+
+ - Promise.prototype.finally()
-
+
- 方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是
ES2018
引入标准的。
+ finally
方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled
还是rejected
。这表明,finally
方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。
+
+ - 方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是
3.2 对象方法
-
+
Promise.all()
+-
+
等待多个异步操作完成:只有这 6 个实例的状态都变成
+fulfilled
,或者其中有一个变为rejected
,才会调用Promise.all
方法后面的回调函数。+1
2
3
4
5
6
7
8
9
10// 生成一个Promise对象的数组
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
+
+
-
+
如果作为参数的 Promise 实例,自己定义了
+catch
方法,那么它一旦被rejected
,并不会触发Promise.all()
的catch
方法。+1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result)
.catch(e => e);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result)
.catch(e => e);
//该方法返回的是一个新的 Promise 实例,p2指向的实际上是这个实例。
//该实例执行完catch方法后,也会变成resolved,
//导致Promise.all()方法参数里面的两个实例都会resolved,
//因此会调用then方法指定的回调函数,而不会调用catch方法指定的回调函数。
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 报错了]
+
-
+
Promise.race():
+-
+
- 最早执行完的异步操作返回的状态为最终状态。 +
+Promise.resolve()
+-
+
- 将现有对象转为 Promise 对象。
-
+
- 如果参数是 Promise 实例,原封不动地返回这个实例。 +
- 参数是一个 thenable 对象(
thenable
对象指的是具有then
方法的对象),将这个对象转为 Promise 对象,然后就立即执行thenable
对象的then
方法。
+ - 参数不是具有then方法的对象,或根本就不是对象,则
Promise.resolve
方法返回一个新的 Promise 对象,状态为resolved
。Promise.resolve
方法的参数,会同时传给回调函数。
+ - 不带有任何参数,直接返回一个
resolved
状态的 Promise 对象。
+
+
+- 将现有对象转为 Promise 对象。
Promise.reject()
+-
+
- 返回一个新的 Promise 实例,该实例的状态为
rejected
。
+
+- 返回一个新的 Promise 实例,该实例的状态为
Promise.try()
+-
+
- 等待补充 +
+