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的成功或失败。