AI智能
改变未来

Promise以及async/await

Promise以及async/await

  • 一、异步编程
  • 一、同步API
  • 二、异步API
  • 三、同步API与异步API的区别
  • 二、回调地狱与Promise
  • 三、ES7中的async/await
  • 一、异步编程

    谈到Promise不得不说这个异步编程的概念,还有涉及到的回调地狱。在JavaScript中API分为同步API和异步API,那么什么是同步API,什么又是异步API呢?

    一、同步API

    同步API:只有当前API执行完成后,才能执行下一个API。JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。平常我们写的一般JavaScript的代码是按顺序执行的,这就是同步API。

    二、异步API

    异步API:当前API的执行不会阻塞后续代码的执行。异步API是一个耗时操作,

    比如说发送请求,文件读取,定时器的回调,DOM的事件处理函数等等

    。 JavaScript的异步是通过回调函数实现的,即通过任务队列,在主线程执行完当前的任务栈(所有的同步操作),主线程空闲后轮询任务队列,并将任务队列中的任务(回调函数)取出来执行。“回调函数”(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。其他更详细的异步API信息可以自行了解JS的事件循环(Event Loop)机制。

    三、同步API与异步API的区别

    • 1、同步API可以从返回值(
      使用return

      )中拿到API的执行结果,但是异步API是不可以的。比如说定时器当中的函数的返回值是不可以直接拿到的。

      异步API的值是通过回调函数拿到的

      。不能在定时器的回调函数中使用return将返回值返回,只能在调用回调函数时的实参当中。
      演示定时器中的异步API返回值的获取:

    function fn(callback){//定时器的回调是异步API,只能通过回调函数才能将值返回,不能使用returnsetTimeout(function(){callback({msg:\'我是返回值\'},1000)})}// 调用函数时,必须传递回调,回调的形参即是异步API的返回值fn(function(data){console.log(data)})
    • 2、代码执行顺序的不同
      同步API从上到下依次执行,前面代码会阻塞后面代码的执行。
      异步API不会等待API的执行完成再向下执行代码。
      代码的执行顺序:在执行代码时,将同步任务放在同步代码执行区,异步任务放在异步代码执行区,将异步任务的回调函数放在回调函数队列,当同步代码执行完毕之后,再去执行异步任务的回调函数。

    二、回调地狱与Promise

    • 1、回调地狱现象的出现:异步API的回调函数执行了,就代表异步任务执行完毕,可以拿到返回值了,
      如果我们想按顺序实行多个异步任务,那么就将第二个异步任务放在第一个异步任务的回调函数当中

      ,如果任务有多个,那么就是一个回调函数嵌套着一个回调函数,这种现象就叫做

      回调地狱

    • 2、
      ES6回调地狱的解决:promise

      :Promise是一个构造函数,使多个异步函数依次执行。这个对象可以使用then方法获取返回值,then方法的参数是回调函数,返回值在回调函数的形参中。.

    • 3、Promise语法:let promise = new promise((resolve,reject)=>{
      放置异步任务:定时器和文件读取等。
      resolve是将返回值返回给外部,
      reject是将失败信息返回给外部。这两个参数就是两个回调函数。
      })
    • 4.使用示例:

    三、ES7中的async/await

    自从promise出现之后,回调地狱的问题是解决了,但是可以从上面的示例中看到,代码结构依旧臃肿,依旧存在嵌套。ES7中的async/await就是来解决上面的代码臃肿问题的,async/await也称之为异步函数。非常推荐使用!!!
    需要注意以下几点:

    • 1、在普通函数定义前加上async关键字。
    • 2、异步函数的
      默认返回值就是promise对象

    • 3、
      返回值可以在异步函数内部使用return返回

      ,在外部还是使用then获取。错误信息使用throw抛出,还是使用catch获取。但是在异步函数内部抛出错误信息之后,后面的代码将不再执行。

    • 4、
      await关键字

      :只能出现在异步函数中,这个关键字后面只能跟promise对象,可以暂停异步函数的执行,等待promise对象返回结果后再向下执行函数。用来决定异步函数的执行顺序。
      使用示例1:

      使用示例2:

    // 发送异步请求,获取数据async getTableInfo(){const {data:res} = await this.axios.get(\"你的url\")this.tableData= res.data}

    函数名前加上async之后才可以才函数内部使用await关键字

    ,await后面必须跟的是promise对象,而axios是基于promise的。加上await之后会等待当前请求返回结果获取到之后,也就是先拿到data,再向下执行this.tableData= res.data。

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Promise以及async/await