使用promise解决回调地狱_解决回调地狱(一): Promise

前言: Promise是异步编程的一种解决方案, 比传统的解决方案--回调函数和事件更加强大.由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象.

没有Promise之前,解决异步都是依赖回调,但执行多个具备前后顺序的异步操作时代码就会非常乱并且出现问题难调试.

image.png

这只是简单的数据库查询操作,当操作多时就会回调中嵌着回调,所谓的回调地狱.

使用Promise呢?

image.png

横向写代码变成了纵向,更加的直观,使用then进行下一步,代码清晰.

说一下Promise的基本用法, Promise有三种状态. 可以看下面的图片

image.png

Promise一旦新建就立刻执行, 此时的状态是Pending(进行中),它接受两个参数分别是resolve和reject.它们是两个函数.

resolve函数的作用是将Promise对象的状态从'未完成'变为'成功'(由Pending变为Resolved), 在异步操作成功时,将操作结果作为参数传递出去;

reject函数的作用是将Promise对象的状态从'未完成'变为失败(由Pending变为Rejected),在异步操作失败时调用,并将异步操作的错误作为参数传递出去.

Promise的用法

1.生成Promise实例

执行一系列同步操作

3.使用resolve函数将异步操作的结果传递出去, reject函数传递异步操作的错误

4.用then方法分别指定Resolve状态和Reject状态的函数,then方法返回一个新的Promise实例,因此可以采用链式写法

image.png

catch函数: 用于指定发生错误时的回调函数, 可以看成是 .then( null, reject() );当执行多个then操作时,建议用catch进行错误处理, 不用每个then函数都写一个reject的回调函数

image.png

catch回捕捉到前面执行时发生的错误.

Promise.all( 传入一个数组,每一项分别是一个Promise实例 ), 当数据里的Promise状态都变为resolve时, Promise.all状态才变为resolve

只要有一个Promise的状态变为reject, Promise.all就变为reject; 可以将数组里的Promise看成是 "与" 关系

Promise.race( 传入一个数组,每一项分别是Promise实例 ), 与Promise.all相反, race可以看到 是 "或" 关系, 只要有一个Promise状态变为resolve, Promise.all 就变为resolve

Promise.resolve(): 将现有对象转为Promise对象

(1) 参数是一个Promise实例的话,不做任何变动,返回原对象

(2) 参数是一个具有then方法的对象

image.png

Promise.resolve方法会将这个对象转为Promise对象, 然后立即执行该对象的then方法

(3) 参数不具有then方法, 或者根本不是对象. Promise.resolve方法返回一个新的Promise对象, 状态为Resolve

image.png

(4) 不带任何任何参数

Promise.resolve方法直接返回一个Resolve状态的Promise对象

Promise.reject(): 返回一个新的Promise实例,该实例状态为reject; 参数用法与Promise.resolve()方法完全一致

注意

Promise.resolve(返回的数据将成为下一个then函数中的参数)

Promise.resolve()

.then(function(){

//异步函数

}).then(function(){

//异步函数

})

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值