promise

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值