promise简介
promise是异步编程的一种解决方案,promise是一个对象,是通过监听状态去调用回调方法的一种方式
promise有三种状态,pending,fullfiled,rejected,状态一旦发生改变,就不会再变了,new一个promise实例之后,会立即执行。
promise是解决异步的问题,但他本身不能说是异步的
promise本身有all,resolve,reject等方法
promise原型上有then,catch的方法
promise的构造函数接收一个参数,函数,这个函数参数要提供两个参数,一个是resolve成功之后执行的回调方法,一个reject失败之后执行的回调方法
promise的then传入两个参数,一个是resolve之后调用的方法,一个是reject之后调用的方法
catch和then的第二个参数一样,当reject之后回调
在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个
all
当所有的任务都执行完成时,Promise.all()返回resolve,但当有一个失败(reject),则返回失败的信息,即使其他promise执行成功,也会返回失败。可以用一句话来说Promise.all(),要么全有要么全无。
当promise.all中有一个reject的时候,就会返回失败的promise的返回信息
var promiseArray = []
promiseArray.push(promiseResove(1))
promiseArray.push(promiseReject(3))
promiseArray.push(promiseResove(2))
// 将传入promise.all的数组进行遍历,如果catch住reject结果,
// 直接返回,这样就可以在最后结果中将所有结果都获取到
var handlePromise = Promise.all(promiseArray.map(function(promiseItem) {
return promiseItem.catch(function(err) {
return err
})
}))
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})
和之前唯一的不同就是在promise数组添加了一个回调函数,当数组中有接口reject时,catch住结果直接返回,这样失败的结果也可以当做成功处理,所以在promise.all中我们可以监听到所有结果的返回,然后在针对不同的返回值进行处理
race
表面上看promise是解决了层层回调的问题,但是promise的根本是状态,通过维护状态,传递状态从而达到调用回调方法的目的,
解决的问题
回调地域的问题
并发请求的问题,可以获取到并发请求的返回值
手写promise
class Promise{
constructor(executor){
//设置状态等
let status = 'pending';
let value = 'undefined'
let reson = 'undefined'
//设置resolve回调数组和reject回调数组
let onResolvedCallbacks = []
let onRejectedCallbacks = []
let resolve = (data)=>{
if(this.status == 'pending'){
this.value = data;
this.status = resolved;
this.onResolvedCallbacks.foreach(fn=>fn())
}
}
let reject = (reason)=>{
if(this.status == 'pending'){
this.reason = reason;
this.status = fulfiled;
this.onRejectedCallbacks.foreach(fn=>fn())
}
}
then(onFulFilled, onRejected) {
if (this.status === 'resolved') {
onFulFilled(this.value);
return new Promise() 但是规范要求不能返回自己 所以需要
}
if (this.status === 'rejected') {
onRejected(this.reason);
}
// 当前既没有完成 也没有失败
if (this.status === 'pending') {
// 存放成功的回调
this.onResolvedCallbacks.push(() => {
onFulFilled(this.value);
});
// 存放失败的回调
this.onRejectedCallbacks.push(() => {
onRejected(this.reason);
});
}
}
try{
executor(resolve,reject)
}cacth(e){
reject(e)
}
}
}
function resolvePromise