ES6中的promise的使用

一、提出promsie的目的?

  • 为解决回调地狱的问题(主要是异步嵌套的可读性可信任问题)

那什么是回调地狱?什么是回调函数?

  • 回调地狱: 通俗来说就是将函数作为参数,层层嵌套。
  • 回调函数:一个函数作为参数需要依赖另一个函数执行调用。

嵌套到底有什么问题?来看下面的代码,这就是一个函数嵌套,我们经常这样写,代码的缩进有种金字塔的视觉,容易成读代码的有点不方便之外就是看起来不那么美观,
ES6中的promise的使用再来看一个面试中常见的顺序执行问题,打印的结果是什么?(自己执行下试试)
ES6中的promise的使用再来看一个简洁的回调:
ES6中的promise的使用这部分代码主要完成了什么?

  • 对于回调函数handePhoto声明并定义
  • 函数downloadPhoto在下载完图片后,调用回调函数handePhoto进行处理
  • 最后输出Download started!

如果异步的嵌套都是这样干净整洁,那“回调地狱”给程序猿带来的伤害马上就会减少很多。

二、如何解决回调地狱问题?

  • 保持代码简短、用功能化的函数名命名函数
  • 拆解function:将各步拆解为单个的function
  • 处理每一个错误
  • Promise以自顶向下的方式执行,可以使用try / catch处理更多类型的错误
  • Generators生成器:让你“暂停”单个函数,而不会暂停整个程序的状态
  • async/await:看似同步的异步操作,通过await将函数挂起,等待await后的函数返回,再执行下面的语句。

三、详细说明promise用法

promise函数(三个状态、两个参数、then链式调用)

  • 允许你以一种同步的方式编写异步代码,构造一个Promise实例需要给Promise构造函数传入一个函数,该函数有两个形参,分别是resolve和reject;
  • 该实例有三个状态:pending(等待状态)、fulfilled(返回满足条件的状态)、rejected(延时对象不满足条件)状态 。pending–>fulfilled状态执行resolve();pending–>rejected状态执行rejected();
  • Promise上还有then方法,then 方法就是用来指定Promise 对象的状态改变时确定执行的操作,resolve 时执行then的第一个函数,reject时执行then的第二个函数;

promise函数基本语法
ES6中的promise的使用promise函数then的语法

  • then()里有两个回调函数,第一个是成功后(resolve返回)的回调function(num) {}, 另一个是失败后(reject返回)的回调function(err) {},异常发生时可以放在第二个回调里面处理。
  • 也可以在then后面加.catch,在这里面进行异常处理
    ES6中的promise的使用

promise的其他函数(.all、.race)

  • Promise.all:可以将多个实例组装成一个新的实例,成功的时候返回一个成功数组,失败的时候则返回最先被reject失败状态的值
    ES6中的promise的使用
  • Promise.race:可以理解为赛跑的意思,也就是说Promise.race([p1, p2, p3])里面的结果哪个获取的快,就返回哪个结果,不管结果本身是成功还是失败

ES6中的promise的使用