简述Promise

115 阅读4分钟

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函数都会中断执行。

image.png