异步请求方法 promise

1. 回调地狱

实现异步函数顺序执行的传统方法
即回调函数的深层次嵌套结构

fn1(()=>{
	fn2(()=>{
		fn3(()=>{
			fn4()
		})
	})
})

当函数执行体代码非常多时 回调地狱会导致代码结构看起来非常混乱 ,对代码可读性 和 调试造成很大的麻烦

2. 解决方法

ES6中提供了Promise对象 用于实现异步函数的顺序执行 Promise 是一个对象,从它可以获取异步操作的消息。

Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
Promise对象的状态改变只有两种情况
pending → fulfiled
pending → rejected
一旦状态改变,就不会再变
如果改变已经发生 再对Promise对象添加回调函数,也会立即得到这个结果

Promise对象的缺点:

  1. 一旦创建 立即执行 无法中途取消
  2. 如果不设置回调函数 其内部抛出的错误不会反应到外部
  3. 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

2.1 Primise对象使用方法

new Promise(function(resolve,reject){
if(//判断异步操作是否成功){ resolve( result//异步操作的执行结果)}
else{ reject(err//异步操作失败的错误信息)}
})
Promise构造函数 中放入一个异步操作的回调函数 此回调函数有两个函数作为参数
resolve() 异步操作执行成功时 将异步操作的结果作为参数传递出去
reject() 异步操作执行失败时 将异步操作报出的错误作为参数传递出去

Promise.prototype.then()
then方法有两个回调函数参数 第二个参数可选 不一定提供
第一个回调函数在Promise 对象状态变为 resolved时调用
第二个回调函数在Promise 对象状态变为 rejected时调用
这两个函数都接受Promise对象传出的值作为参数
then方法返回的是一个新的Promise实例
then方法使用链式写法 可以指定一组按照次序调用的回调函数
后一个回调函数会等待前一个回调函数执行完成 Promise对象状态改变后执行

Promise.prototype.catch()
Promise.prototype.catch()等同于 then(null, rejection)或.then(undefined, rejection)
如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数;then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。错误总是会被下一个catch语句捕获。
因此常用的写法是
new Promise(function(resolved,rejected){}).then(function(value){}).then(). … .catch(function(err){})

promise对象内部的错误不会影响到promise外部的代码
即使promise内部存在错误 浏览器运行时保持 promise之后的代码也会继续执行

Promise.prototype.finally()
finally方法用于指定Promise对象最后状态如何都会执行的代码
此方法内的回调函数不接受参数 即与之前promise实例的状态无关

Promise.resolve()
此方法将现有对象转为Promise对象
Promise.reject()
此方法也会返回一个新的 Promise 实例,该实例的状态为rejected。

Promise.all()
此方法用于将多个Promise实例包装为一个新的Promise实例
Promise.all方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。
数组中所有Promise实例的状态为resolved时 新的Promise实例的状态才会变为resolved 且每个成员的执行结果组成一个数组传递给新实例的回调函数
数组中只要有一个成员状态变为rejected 新实例的状态就为rejected 且第一个状态为rejected的成员的返回值会传递给新实例的回调函数

Promise.race()
Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
上面代码中,只要数组成员之中有一个实例率先改变状态,新实例的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给新实例的回调函数。
Promise.race方法的参数与Promise.all方法一样,如果不是 Promise 实例,就会先调用Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值