浅谈promise、async、await|青训营笔记

132 阅读3分钟

浅谈Promise、async、await|青训营笔记

mobilebanner.png

这是我参与「第四届青训营 」笔记创作活动的第12天

前言

在前几节青训营课上代码的演示,总会有promise、async、await的调用,由于经常会记不太清楚它们的用法,这几天通过查阅资料等各种学习方法学习后对它们总结一下,以此加强印象与更好理解它们。

诞生Promise,async,await的原因

首先明确Promise是ES6提出的异步编程的一种解决方案,出现Promise的原因就是为了更好的解决回调地狱问题(多个串联的异步操作形成)而async与await是ES7提出的,是为了更好的解决回调地狱的问题。

演示多个串联的异步操作(回调地狱)

代码从左到右地延伸,如果不断地异步操作需要回调函数,则不断延申,代码会很难维护,也很难观看

演示多个串联的异步操作(利用promise)

利用promise能得到一样地效果,而且代码很整洁,结构很美观,很好维护代码,增强了代码可读性

浅谈promise

  • Promise有三种状态(pending:进行中、fulfilled已成功、rejected已失败),状态不受外界影响,只有异步操作地结果,决定当前是哪一种状态,一旦状态改变就不会再变(pending-->fufilled,pending-->rejected。
  • 本质上promise是一个构造函数,用来生成promise实例
  • Promise构造函数接受一个函数作为参数,这个函数有两个参数(resolve,reject)。
  • resolve函数:将Promise对象地状态从未完成变成成功,在异步操作成功地时候调用,返回异步操作地结果作为参数传递出去
  • reject函数:将Promise对象地状态从未完成变成失败,在异步操作失败地时候调用,返回异步操作地结果作为参数传递出去

Promise实例方法

  • then( ):当实例状态改变的时候的回调函数,拥有两个回调函数作为参数,then的两个回调函数分别接收参数,第一个参数是resolve传来的异步操作成功的参数,第二个是reject传来的异步操作失败的参数
  • catch( ):用于指定发生错误的回调函数,(拿到异步操作失败的结果),一般来说通过catch替代then的第二个参数
  • finally( ):用来指定不管Promise对象状态最后如何,都会执行的操作
  • all( ):用于将多个Promise实例,包装成一个新的Promise实例,参数建议是数组(只要是iterator接口就行),新的实例的状态,由组成的Promise实例决定,只有全部成功,新实例才会成功,但是一个失败,那么就是失败,返回的就是第一个失败的返回值,会传递给新的实例对象的回调函数。常用于多个请求结果合并在一起。
  • race( ):将多个Promise实例包装成一个新的Promise实例,区别于Promise.all,只要实例中有一个先改变状态,就会把这个实例的参数的返回值传给race的回调函数(只接受一个参数),应用场景:请求超时

async、await

async相当于一个函数的修饰词,用来修饰一个函数,其返回值未promise对象,而await只能在async修饰的函数中出现,也相当于一个修饰词,用来修饰操作。await修饰的异步操作默认返回一个Promise中resolve回调函数的结果,而且await的操作必须一个接一个来,只有完成了上一个,下一个才会执行。要是操作返回的promise返回的结果是一个失败的结果,这时候我们就要有try...catch来捕捉到这个错误。