一、含义和用法
- 特点:
1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果 - 优点:有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
- 缺点:首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段
- 用法:
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});
其中then
方法指定的回调在同步任务执行完毕后才执行
二、Promise.prototype.then()
它的作用是为 Promise 实例添加状态改变时的回调函数,then
方法的第一个参数是resolved
状态的回调函数,第二个参数是rejected
状态的回调函数,它们都是可选的。它可以采用链式写法,即前一个then
方法返回的结果作为下一个then
方法的参数
三、Promise.prototype.catch()
Promise.prototype.catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数
p.then((val) => console.log('fulfilled:', val))
.catch((err) => console.log('rejected', err));
// 等同于
p.then((val) => console.log('fulfilled:', val))
.then(null, (err) => console.log("rejected:", err));
一般来说,推荐使用catch
方法,catch
可以捕获前面then
方法执行中的错误。Promise
对象后面要跟catch()
方法,这样可以处理Promise
内部发生的错误。
四、Promise.prototype.finally()
用于指定不管 Promise
对象最后状态如何,都会执行的操作
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
五、Promise.all()
用于将多个 Promise 实例,包装成一个新的 Promise 实例,新的Promise对象的状态分成两种:
1)全部成员状态为fulfilled,该Promise为fulfilled;
2)只要成员中有一个状态成rejected,则该Promise为rejected
//promises是包含 6 个 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.race()
将多个 Promise 实例,包装成一个新的 Promise 实例,新Promise实例的状态与最先改变状态的成员一致
const p = Promise.race([p1, p2, p3]);
七、Promise.allSettled()
用于确定一组异步操作是否都结束了,该方法接受一个数组作为参数,数组的每个成员都是一个Promise
对象,并返回一个新的 Promise
对象,它的回调函数会接收到一个数组作为参数,该数组的每个成员对应前面数组的每个 Promise
对象
const resolved = Promise.resolve(42);
const rejected = Promise.reject(-1);
const allSettledPromise = Promise.allSettled([resolved, rejected]);
allSettledPromise.then(function (results) {
console.log(results);
});
// [
// { status: 'fulfilled', value: 42 },
// { status: 'rejected', reason: -1 }
// ]
八、Promise.any()
与Promise.all()
类似,新的Promise对象的状态分成两种:
1)只要成员中有一个状态成fulfilled,该Promise对象为fulfilled;
2)全部成员为rejected,则该Promise对象为rejected
九、Promise.resolve()
将现有对象转为Promise
对象
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
Promise.resolve()
方法的参数分成四种情况:
1)参数是一个Promise
实例
不做任何修改、原封不动地返回这个实例
2)参数是一个具有then
方法的对象
Promise.resolve()
方法会将这个对象转为 Promise 对象,然后就立即执行该对象的then()方法,不等到本轮循环结束。
3)参数不是具有then()
方法的对象,或根本就不是对象
返回一个新的Promise
对象,状态为resolved
,返回 Promise 实例的状态从一生成就是resolved,所以回调函数会立即执行
const p = Promise.resolve('Hello');
p.then(function (s) {
console.log(s)
});
// Hello
4)不带有任何参数
直接返回一个resolved
状态的Promise
对象。
十、Promise.reject()
与Promise.resolved
类似,返回一个新的 Promise 实例,该实例的状态为rejected
十一、Promise.try()
Promise.try
方法让同步函数同步执行,异步函数异步执行,并且让它们具有统一的 API