promise
- 是ES6新增的一个新特性
- promise是异步编程的一种解决方案,
- 它可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调地狱
promise是一个构造函数,可以创建一个promise实例,里面保存着某个未来会结束的事件的结果(这个事件通常是指异步操作) promise实例一旦被创建,就会立即执行
promise有三种状态
promise有三种状态: pending(等待态),fulfilled(成功态),rejected(失败态) ;状态一旦改变,就不会再变。
- 如果状态变为resolved,则会调用then()方法指定的回调函数;
promise 方法
then()方法
then()方法它的作用是当promise状态变成成功时会触发的回调函数,
then()里面有两个参数,
- 第一个参数是成功的回调函数,返回的是一个新的promise对象(如果没有返回一个promise对象,则默认返回的状态是resolved),因此可以用链式写法,
- 第二个参数是失败的回调函数,一般用catch()方法来代替,状态变为rejected时,就会调用catch()方法指定的回调函数
finally()方法
finally()方法用于不管最后状态如何,都会触发执行的操作
finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。finally本质上是then方法的特例:- 场景:服务器使用 Promise 处理请求,然后使用
finally方法关掉服务器
.then(function () {
// ...
})
.finally(server.stop);
3. all()
all方法可以完成并行任务, 它接收一个数组,数组的每一项都是一个promise对象。当数组中所有的promise的状态都达到resolved的时候,all方法的状态就会变成resolved,如果有一个状态变成了rejected,那么all方法的状态就会变成rejected。
- 场景: 当遇到发送多个请求并根据请求顺序获取和使用数据的场景,就可以使用Promise.all来解决。
调用
all方法时的结果成功的时候是回调函数的参数也是一个数组,这个数组按顺序保存着每一个promise对象resolve执行时的值。
4.race()
赛跑 race方法和all一样,接受的参数是一个每项都是promise的数组,但是与all不同的是,当最先执行完的事件执行完之后,就直接返回该promise对象的值。如果第一个promise对象状态变成resolved,那自身的状态变成了resolved;反之第一个promise变成rejected,那自身状态就会变成rejected。
- 那么
race方法有什么实际作用呢?当要做一件事,超过多长时间就不做了,可以用这个方法来解决:
Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})
promise虽然避免了层层嵌套的回调地狱问题,但它的写法不够直观,可读性较差,所以在开发中,我们一般会配合async和await来使用
5.Promise.any()
Promise.any() 返回一个 Promise。它的结果取决于参数 promises:
接收一个可迭代的对象( iterable),(比如:Array, Map, Set都属于ES6的iterable类型)
成功(Fulfillment)
-
当任何一个被传入的
promise 成功的时候,无论其他的promises 成功还是失败,此函数会将那个成功的promise,作为返回值 。 -
如果传入的参数是一个空的可迭代对象,这个方法将会同步返回一个已经完成的promise。 -
如果传入的任何一个 promise 已成功,或者传入的参数不包括任何 promise, 那么 Promise.any 返回一个异步成功的promise。
失败/拒绝(Rejection)
如果所有传入的 promises 都失败,Promise.any 将返回异步失败,和一个 [AggregateError]对象,它继承自 [Error],有一个 errors 属性,属性值是由所有失败值填充的数组。
async
- async函数本质上是一个语法糖,它的作用就是使异步操作变的更加方便,语义更清晰!
- async函数返回的是一个promise对象 ,也可以用then()指定下一步的操作
await可以理解为它就是一个等待的动作,等待右边的代码执行完成
当async函数执行的时候,遇到await就会先返回,等待异步操作完成后,再执行后面的代码
await后面如果是一个 Promise 对象,则返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。
任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。