- 异步编程的解决方案,链式操作降低编码难度,代码可读性强
状态
-
promise对象有三种状态:
pending
(进行中)fulfilled
(已成功)rejected
(已失败)
特点:
- 对象的状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态
- 一旦状态改变(从
pending
变为fulfilled
和从pending
变为rejected
),就不会再变,任何时候都可以得到这个结果
promise实例
const promise = new Promise(function(resolve, reject) {});
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败”
实例方法
then():
状态发生改变时的回调函数。第一个参数是resolved
状态的回调函数,第二个参数是rejected
状态的回调函数。返回新的promise
实例catch()
:发生错误时的回调。错误具有“冒泡”性质,会一直向后传递,直到被捕获为止finally()
:不管 Promise 对象最后状态如何,都会执行的操作
构造函数的方法
- all():将多个
Promise
实例,包装成一个新的Promise
实例。const p = Promise.all([p1, p2, p3]);
- race():有一个实例率先改变状态,
p
的状态就跟着改变 - allSettled():都返回结果了,p才完成
- resolve()
- reject()
- try()
手写题
- 实现Promise.all
/**
* 参数:由promise实例构成的数组(也有可能不是promise实例)
* 返回值:返回一个promise新实例
*
* 只有参数数组中所有的promise实例变成fulfilled状态后,promise.all返回的实例才进行fulfilled状态,否则进入rejected状态
*
*/
Promise.MyAll = function(promises) {
return new Promise((resolve, reject) => {
let arr = [];//接收promises数组中实例的结果
let count = 0;//用于判断promises数组中被处理的个数,以判断什么时候返回
promises.forEach((item,index) => {
Promise.resolve(item).then((res) => {
arr[i] = res;
count++;
if(count === promises.length) resolve(arr);
}).catch(reject);
})
})
}