Promise
特点:
1、对象状态不受外界影响(pedding进行中、fulfilled已成功、rejected以失败)
2、一旦转跳发生给吧,就不会再变,任何时候都可以拿到这个结果。Promise对象状态改变只有两种
pending -> fulfilled 或 pending -> rejected 只要发生这两种改变,状态就会凝固,此时称之为resolved(已成型)
-
Promise新建后立刻执行指定的内容,等宏任务执行完后再将then存放到微任务的Event Queue中等待执行。等到主线程的空下来后在执行then(按照微任务的Event Queue顺序)
-
then方法是定义在原型对象 Promise.prototype上的,用于为Promise是添加改变涨停后的回调函数,返回的是Promise对象,所以支持后面再调用另一个then。假如第一个then里面返回的是另一个Promise对象,那么第二个then会等待返回另一个Promise对象的状态发生改变后再进行觉得调用哪个回调函数(resolved或rejected)
-
Promise.prototype.catch():
- Promise.prototype.catch()是特殊的
.then(null, rejection)
或.then(undefined, rejection)
的别名。增添catch()方法便于区分Promise状态转变到底是成功还是失败,而且将error信息从then的第二个回调函数参数中换到 .catch(error)中,能使代码更加简洁明了。 - 假如Promise对象没有添加catch方法,那么假如Promise内部发生错误是不会给外部捕获到的,同时也不影响外部then()的执行
- catch后面也可以继续调用then和catch,假如catch的操作中存在可能会发生的错误可以在后面再调用多一个catch方法来捕获第一个catch可能出现的错误!
- Promise.prototype.catch()是特殊的
-
Promise.prototype.finallly():
finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。不依赖于 Promise 的执行结果。- finnally()方法等同于 一段执行代码 在then() 和 catch() 中都写入了,使用finally()方法就可以提取出then和catch方法中一些相同的操作减少代码的重复。
-
Promise.all()
:-
Promise.all()
方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。const p = Promise.all([p1, p2, p3]);
-
p实例的状态:得等全部Promose成员都进入resolved(已定型)
-
只有所有Promise成员都是fulfilled,p的状态才会转为fulfilled,并且将所有Promise的返回值以数组形式返回
-
存在一个Promise成员是rejected状态,那么p的状态会转为rejected,p的返回的值是第一个被rejected的实例的值。不是全部!!!!
-
Promise.all()
的catch
方法触发:- 如果某个Promise成员自己带有catch方法,那么当他内部报错后不会调用Promise.all()的chatch方法
- 只有某个Promise成员没有自己的catch方法,就回去调用Promise.all()的方法
-
-
Promise.any()
- Promise.any()
方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。
只要参数实例有一个变成
fulfilled状态,包装实例就会变成
fulfilled状态;如果所有参数实例都变成
rejected状态,包装实例就会变成
rejected`状态。与all()包装方法相反?
- Promise.any()
-
Promise.race():
const p = Promise.race([p1, p2, p3]);
- 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
- 只要
p1
、p2
、p3
之中有一个实例率先改变状态,p
的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p
的回调函数。所有这个race方法使用了看谁速度快执行谁?只要有一个执行完毕就停止? - 如果指定时间内没有获得结果,就将 Promise 的状态变为
reject
,否则变为resolve
。相比于直接在Promise内部设置setTimeout返回错误(直接报错,而且无法catch),这里至少会以reject状态结束同时触发reject的回调函数!!
const p = Promise.race([
fetch('/resource-that-may-take-a-while'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
]);
//Error: fail
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
-
Promise.allSettled()
- Promise.allSettled()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例
- 只有等到所有这些参数实例都返回结果,不管是
fulfilled
还是rejected
,包装实例才会结束。跟race()包装正好相反?
-
Promise.resolve():
-
有时需要将现有对象转为 Promise 对象,
Promise.resolve()
方法就起到这个作用const jsPromise = Promise.resolve($.ajax('/whatever.json'));
-
Promise.resolve():的参数类型
- Promise 实例:不做改变
thenable
对象(带有then方法的对象):将该对象转为Proimse对象,然后立刻执行它自带的then方法- 参数不是具有
then
方法的对象,或根本就不是对象:返回一个新的 Promise 对象,状态为resolved
。 - 不带有任何参数:直接返回一个
resolved
状态的 Promise 对象。
-
-
Promise.reject(reason)
方法也会返回一个新的 Promise 实例,该实例的状态为rejected
。
Promise的应用
- 加载图片
- Generator 函数与 Promise 的结合