javaScript-异步编程

2021-10-16·3min
type
Post
summary
status
Published
category
tags
slug
date
Oct 16, 2021
password
icon
📌
在javaScript中,异步编程是很重要的概念。
由于异步代码的处理结果我们是不能立马知道的,只有当异步的回调函数出列执行,我们才能获取到异步的结果。
为了能够更好组织异步代码的结构和逻辑,获得异步处理的结果。先后出现了使用回调函数、promise、async await这几种不同的异步处理方式。

使用回调函数

顾名思义,就是在异步代码的回调函数中获取异步的结果,并对这个结果进行处理。
当只对异步的结果做单次的处理时,回调函数形式的处理是易读的。但在实际的开发中,经常会出现需要以第一个异步结果为值来触发下一个异步请求。
为了保证多个异步代码的顺序调用,就必须在回调函数中嵌套另一个回调函数。当嵌套的层次过多,代码就会变得非常反人类且难以理解,也就是出现了所谓的回调地狱,也会非常难以维护。

promise

ES6中增加了promise类型。promise也就是承诺,一个对未确定的结果的承诺。
promise中有三种状态:pending(待定)、resolved(已解决)、rejected(已失败)。
当异步代码有了结果时,就会改变promise的状态,并把相应的值存储起来,以供then方法调用。
对于处理需要顺序调用的多个异步代码,就可以以then链式调用的方式来进行处理,这样就避免了回调地狱。代码维护和组织也更加优雅了。

async await

async关键字可以用来声明异步函数,这个异步函数的返回值有以下三种情况:
  1. 当返回一个普通值时,会被Promise.resolve()包装成promise对象。
  1. 异步函数内部报错时,返回一个rejected状态的promise
  1. 当返回一个promise时,不做处理。
所以对于异步函数的返回值,可以使用then来进行处理。
由于异步函数主要针对不会立即完成的任务,所以需要有一种暂停函数执行以及恢复函数执行的能力。
在异步函数内部使用await关键字可以暂停异步函数后面代码的执行,让出执行进程。
当await关键字右边的值可用时,会向消息队列中推送一个任务。当任务出列执行时,会恢复异步函数的执行。
对于await关键字右边的值,有以下三种情况:
  1. 当await右边是一个普通值时,await不会对这个普通值产生影响。
  1. 当await右边是一个状态为成功的promise对象时,会返回这个promise对象的结果。
  1. 当await右边是一个状态为失败的promise对象时,会将这个失败的promise对象作为整体异步函数的返回值,并且不会继续执行下面的代码。
需要特别注意的一点是,当遇到await关键字时,都会暂停执行整体异步函数,让出执行进程。
有了async await,处理异步代码就可以像处理同步代码一样了,更加优雅且易于维护,可以说async await是异步编程的终极方案。
> cd ..