vue async await理解

async 和 await

async fun():
  语句1
  语句2
  await 语句3 发送request请求网络接口
  语句4 处理请求得到的数据

main():
  语句1
  语句2
  fun()
  语句3

await 语句表示该行之后的所有代码都等待await异步执行的结果返回后再执行,相当于同步了await之后的代码,后面的代码需要依赖该语句有结果之后才能执行
例如
在函数fun中,出现await A语句
表示等待A执行的结果,在这里停住,该函数中该行之后的语句4等都不会执行,跳出该函数去主函数main中执行之后的代码,因为语句4需要处理语句3得到的数据
也表示异步执行A,我先去看看别的,好了通知我,我回来继续await执行之后的代码4,处理得到的数据

async fun()
标记一个异步函数,该异步函数内部要有await才可以

执行该函数fun时,如果后面的代码不依赖该异步执行的结果,就可以用普通调用的方式,即前面不加await,即main中的样子
异步执行fun,不会在fun函数这里等待,而是(执行到fun内部的await时跳出)继续执行之后的语句3

如果后面的代码依赖于该异步执行结果,则需要等待一下,就需要添加await调用fun

协程

一个线程就是一个执行流,可以是一个函数,一条一条执行该函数中的语句就是执行流,该执行流在遇到io时会由操作系统进行上下文切换,将该线程挂起,去执行其他任务,使用栈区保存执行状态等待恢复

协程也是一个执行流,程序员自己实现执行流的切换,使用堆区内存保存寄存器状态,之后读取堆区来重建执行流

协程是异步方式实现的,是无栈的(stackless),普通的函数通过栈区保存执行上下文状态,而协程则直接在堆区运行,运行状态都保存在堆区,随时可以调出,所以可以中断执行并返回
协程通过yield主动让出cpu,通过堆区来实现中断并继续执行,是程序员实现的上下文切换,操作系统并无感知

通常在面对异步任务时,比如io任务,我们可以使用回调函数来指定该io完成后如何处理数据
我们需要写一个函数来处理数据,并将该函数当做参数传递
如此,该io就被分成了两个部分,先请求数据,再用回调函数处理数据

如果使用协程的话,我们可以在request数据时yield让出cpu
在yeild的后面写处理数据的函数
这样就不必使用回调,请求数据和处理数据的代码都在一个函数里,更清晰直观

posted @ 2022-08-05 15:40  ecnu_lxz  阅读(123)  评论(0编辑  收藏  举报