promise 简介
- promise是es6新加入的异步编程解决方案,解决js地狱回调的问题
- 常规写法
new Promise(请求1)
.then(请求2(请求结果1))
.catch(处理异常(异常信息))
语法
var p=new Promise(function(resolve,reject){...});//executor
p.then(()=>{})//成功resolve
.catch(()=>{});//失败reject
构造函数
Promise构造executor函数,resolve和reject两个函数作为参数传递给executor(executor函数在promise构造函数返回所建的promise实例对象前被调用)。resolve和reject函数被调用的时候,promise的状态改成fulfilled或者rejected。
executor函数内部会执行异步操作,当操作执行完毕,(操作成功的话)调用resolve函数将promise状态改为fulfilled,(操作失败)调用reject函数将promise状态改为rejected。如果在executor函数中抛出了一个错误,promise状态改为rejected。executor的函数的返回值会被忽略
promise的三种状态
pending:初始状态/等待状态,既不是成功也不是失败
fulfilled:操作成功
rejected:操作失败
promise的方法
Promise.all(iterable)
该方法返回一个新的promise对象。
一般情况下,该方法会接受一个iterable参数,里面是一个promise列表,当所有的promise都出发成功才会触发成功,一旦一个失败,会立刻停止其他promise执行。当iterable执行成功了,新的promise对象会将所有的结果以数组形式依次返回。当有一个失败,会返回失败信息。
Promise.all()简单实现
点我!
Promise.race(iterable)
- 当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise绑定的响应句柄,并返回该promise对象
- 说白了就是,多个Promise同时执行,返回最先执行结束的Promise任务的结果,无论成功or失败
Promise.reject(rease)
返回一个状态为失败的Promise对象,并将给定的失败信息传递给相应的处理方法
Promise.resolve(value)
返回一个状态由value决定的Promise对象 - 如果该值是thenable(即带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定,采用它的最终状态
- 否则的话(该value为空,基本类型或者不带他很方法的对象),返回的Promise对象状态为fulfilled,并将该值传递给then方法。
- 如果传入的value本身就是一个Promise对象,则该对象作为Promise.resolve方法的返回值返回
console.log(Promise.resolve(123));
//Promise{<fulfilled>:123}
Promise.prototype.then
Promise.prototype.catch
异步封装promise
表现形式[promise1,promise2,3]–>promise1–>promise2–>3
function packPromise(arr){
let key=null;
for(let p of arr){
key=p.then(key);
}
return key.then();
}
Promise的使用总结
- 首先初始化一个Promise对象,可以通过两种方式创建,这两种方式都会返回一个Promise对象
- new Promise§
- Promise.resolve§
- 然后调用上一步返回的Promise对象的then方法,注册回调函数
- 注册catch异常处理函数,处理前面回调中可能抛出的异常