• js异步编程: Promise, async, await


            async的中文意思是异步async实际上是一个语法糖,修饰的对象是一个函数,用来说明该方法是异步类型。。

            异步其实就是同时做多件事情,即并发。比如js的定时器方法就是一个异步型,假如一个定时器定时10秒,那么在这10秒内,js程序会继续从定时器代码处继续向下执行。

            async经常与await一起使用。 他们组合使用的最大作用就是:将几个具有前后依赖关系的异步操作变为同步运行。

            async和await的底层是promise。是es2017出的,是对promise,generaor等函数的语法封装。

            参考地址:地址

    目录

    0,简述js程序的执行过程

    1,大致的执行过程

    2,什么是回调函数?

    1,async将一个函数标记为异步函数

    2,程序上下代码存在依赖关系时的await写法

    3,程序上下代码不存在依赖关系时的await写法

    4,不能使用forEach或map等方法遍历执行await修饰的函数

    5,await不能修饰普通函数和方法


    0,简述js程序的执行过程

    1,大致的执行过程

            js是解释器类型的语言,类似于python的全局解释器锁,js天生的是单线程执行代码的,既然是单线程,那么就只有一个主线程。

            一个程序由语句,函数,语句块构成。函数又分为函数声明与函数调用,只有函数被调用才会执行函数。而在异步编程中,函数又分为普通同步函数和异步函数。

            所以js从上到下同步执行的过程遇到需要执行异步函数该怎么办?答案是遇到普通函数直接执行,遇到异步函数扔到事件队列里面。等到主线程将同步代码和普通同步函数执行完毕之后,再去执行事件队列里面的异步函数。

            这么做的原因就是单线程的js不可能另开线程去执行异步函数,也不可能让主线程去执行异步函数。注:线程是系统分配资源的最小单位,在上一级他们属于同一个进程,js的这种单线程模式不会产生过多的上下文切换开销,效率高。

            但是在队列里面的异步函数却是有方法实现并发运行的。

    2,什么是回调函数?

            需要等待一段事件之后才能运行的函数。比如定时器的第一个参数就是函数,被称为回调函数,在定时完成之后才能去执行这个回调函数。

    1,async将一个函数标记为异步函数

            异步函数的概念:若某个函数的返回值是一个Promise对象,则这个函数为一个异步函数。在js中比较常用的异步函数就是定时器setTimeout。

            在一个普通函数前面加上async就说明这个函数为异步类型,在这里不用关心async改变了这个函数什么,这只是一种语法形式而已,目的是将这个函数塞进事件队列里面。

            这里只需要知道js从上往下遇到异步函数该怎么做,关于js执行过程中遇到异步函数该怎么办,看这篇文章。这里。

            在async修饰的函数里面我们一般会调用其他的异步函数。

    1. //演示用例,实际上是这样的“await 异步函数1();”
    2. async function f() {
    3. 异步函数1();
    4. 异步函数2();
    5. 异步函数3();
    6. }

    2,程序上下代码存在依赖关系时的await写法

            await的修饰对象也是一个异步函数,他会等待异步函数返回结果之后再去执行他下面的代码。

    1. //演示写法
    2. async function f() {
    3. result1 = await f1();
    4. result2 = await f2(result1);
    5. return result3 = await f3(result2);
    6. }

    3,程序上下代码不存在依赖关系时的await写法

    1. //演示写法
    2. async function f() {
    3. const promiseA = await fetch("http:/l.../post/1");
    4. const promiseB = await fetch("http: /l.../post/2");
    5. }
    6. /*将上面的代码写成下面的这样就行,两个fetch会并发进行(线程级别的并发估计是协程实现的)**********************************************/
    7. async function f() {
    8. const promiseA = fetch("http:/l.../post/1");
    9. const promiseB = fetch("http: /l.../post/2");
    10. const [a, b] = await Promise.all([promiseA, promiseB]);
    11. }

    4,不能使用forEach或map等方法遍历执行await修饰的函数

            下面的写法不可行。原因就是尽管await会等待结果,但是由于foreach和map的特性,可能出现还没有等到结果返回,就已经进入下一个函数,而下一个函数需要上一个函数的结果。这种情况适用于上下代码存在依赖关系。解决方法就是使用传统的for循环。

            假如多个异步函数之间不存在依赖关系且需要循环,可以使用for……await来遍历执行,这种形式是并发执行这些异步函数,效率高。

    5,await不能修饰普通函数和方法

            这里的普通函数指的是全局函数之类的。

  • 相关阅读:
    SAP/PP-40策略下SO不消耗PIR问题
    【数据结构】图的存储结构
    python写一个文本处理器
    VMware 搭建linux操作系统,入门必看
    一篇文章学会React
    SpringBoot框架Mockito的使用
    【微机原理笔记】第 1 章 - 微型计算机基础概论
    YOLOv8改进PAN结构:Lowlevel Feature Alignment,集特征对齐、信息融合和信息注入于一体,增强模型对不同尺寸物体的检测能力
    【vim 学习系列文章 8 -- vim中 has 函数和 let g:介绍】
    模型压缩部署概述
  • 原文地址:https://blog.csdn.net/weixin_44992737/article/details/126065259