Promise的理解

160 阅读2分钟

Promise 的用途

promise在js中主要是解决回调地狱的问题

什么是回调地狱呢?

回调地狱就是我们异步任务中嵌套异步任务太多层,导致我们的代码臃肿,就比如你需要结果需要请求很多个接口,这些接口的参数需要另外那个的接口返回的数据作为依赖,这样就需要我们一层嵌套一层,但是有了Promise 我们就无需嵌套

从语法上讲,promise是一个对象,从它可以获取异步操作的消息;

从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。

promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);

状态一旦改变,就不会再变。

创造promise实例后,它会立即执行。

如何创建一个 new Promise

return new Promise((resolve,reject)=>{})

如何使用 Promise.prototype.then

p.then(onFulfilled[, onRejected]);

p.then(value => {
  // fulfillment
}, reason => {
  // rejection
});

then() 方法返回一个 Promise。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。

如何使用 Promise.all

Promise.all([promise1, promise2]).then(success1, fail1)
promise1和promise2都成功才会调用success1

Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。

需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的, 即p1的结果在前,即便p1的结果获取的比p2要晚。

这带来了一个绝大的好处:在前端开发请求数据的过程中, 偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all就可以巧妙解决这个问题。

如何使用 Promise.race

Promise.race([promise1, promise2]).then(success1, fail1)

顾名思义,Promise.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

promise1和promise2只要有一个成功就会调用success1; promise1和promise2只要有一个失败就会调用fail1;

总之,谁第一个成功或失败,就认为是race的成功或失败。