ECMAScript异步编程

全面解析前端ECMAScript的异步编程 本文旨在系统性地解析ECMAScript中的异步编程模型,涵盖从基础概念到高级用法的完整知识体系。我们将探讨JavaScript如何处理异步操作,分析各种异步编程模式的优缺点,并提供实际开发中的最佳实践建议。文章首先介绍异步编程的基本概念,然后深入分析JavaScript的事件循环机制。接着详细讲解各种异步编程解决方案,最后探讨实际应用场景和性能优化策略。同步(Synchronous): 代码按顺序执行,前一个操作完成后才能执行下一个异步(Asynchronous) 阅读详情

ECMAScript异步编程

涉及知识点:

  • ECMAScript2015+
  • Promise
  • async/await

目录


异步编程

这里写图片描述

  • node.js服务器
const express = require('express')
const app = express()

app.get('/', (req, res) => {
    res.setHeader('Access-Control-Allow-Origin', '*')
    setTimeout(() => {
        res.send('Hello');
    }, 3000)
});

app.listen(8080);
  • 异步请求测试
    这里写图片描述

  • 异步:ajax的事情还没有处理完成的时候,我们点击div,是可以立马变色,ajax的事情并不影响当前页面中其他的效果。

  • 同步:当前线程直接处理

回调地狱(callback hell)

    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        // console.log(this.responseText);
        // 假设获取到了用户信息
        if ( user.isAdmin ) {
            var xhr = new XMLHttpRequest();
            xhr.open('get','http://localhost:8080/getVideo',true);
            xhr.onload = function() {
                // 根据视频信息,当前视频的具体地址
            }
            xhr.send();
        }
    };
    //获取当前用户信息,以下是模拟的url
    xhr.open('get', 'http://localhost:8080/getUserInfo', true);
    xhr.send();
  • 回调地狱的问题:不仅看起来很不舒服,可读性比较差;除此之外还有比较重要的一点就是对异常的捕获无法支持。

Promise对象

基本使用

    new Promise(function(resolve, reject) {
        // 要执行的异步任务
    })
  • Promise的状态: [[PromiseStatus]]
    • pending:初始状态,既不是成功,也不是失败状态
    • fulfilled/resolved:意味着操作成功完成
    • rejected:意味着操作失败

这里写图片描述

  • promise写法影响了书写代码的方式,并没有改变异步的本质。

  • Promise状态:

    • resolve()函数:更改Promise对象为成功状态
    • reject()函数:更改Promise对象为失败状态
  • then方法
    • 任务后续处理函数,一般情况下处理某个Promise任务完成(无论成功还是失败)的后续任务

这里写图片描述

考虑传参情况(因为考虑到局部变量的局限性)

    new Promise( (resolve, reject) => {
        // resolve, reject 这两个函数是可以传入参数的,参数将被传递给then中的函数进行使用
        setTimeout(() => {
            var a = 10;
            resolve(a);
            reject('出错了');
        }, 2000);
    }).then( v => {
        console.log(v);
    }, err => {
        console.log(err);
    });
    .then(onFulfilled/onResolved, onRejected)
    onFulfilled/onResolved:fulfilled/resolved状态下调用
    onRejected:rejected状态下调用

Promise链

这里写图片描述

  • resolve:会输出1,3
  • reject:会输出2,3

  • 前一个then中没有传入参数时,相当于默认传入了一个Promise对象

这里写图片描述

  • 手动处理then方法,让它返回一个指定状态的Promise对象

手动处理then方法,让它返回一个指定状态的Promise对象

总结上面三种情况:
这里写图片描述

解决不能中途退出的问题(catch)

这里写图片描述

catch捕获错误:
这里写图片描述

输出:登录失败,catch以后

Promise.all()

这里写图片描述

输出:
这里写图片描述

Promise.race()

这里写图片描述

谁先执行完就顺带执行了,race的一个执行了,then方法就执行。
这里写图片描述

Promise.resolve()&Promise.reject()

这里写图片描述

  • Promise.reject()返回一个Rejected状态的Promise对象

  • 传一个promise对象
    这里写图片描述
    输出:错误

  • 包含一个then方法的对象(遇到问题,待解决)

这里写图片描述

async&await

这里写图片描述

这里写图片描述
输出:100,200

考虑失败情况
这里写图片描述

这里写图片描述
输出:100,200,传入的值太大了

C++新手也能搞定!Windows下Cesium-Native编译全流程(附依赖下载技巧) 本文为C++新手详细介绍了在Windows系统下编译Cesium-Native库的全流程。重点针对网络环境不佳的情况,提供了手动下载依赖库的实用技巧,并指导用户使用CMake配置、生成解决方案,最终完成编译与测试验证,帮助开发者成功构建这一处理3D地理空间数据的C++运行时库。 阅读详情

相关推荐

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装 1. BNC软件 1.1 软件介绍 The BKG Ntrip Client (BNC) is an Open Source multi-stream client program designed for a variety of real-time GNSS applications. It was primarily designed for receiving data streams from any Ntrip

小马甲的新马甲 7806

ECMAScript6(16):异步编程,搞懂这些直接来阿里入职

语义明确,async 表示异步,await 表示后续表达式需要等待触发的异步操作结束co 模块中 yield 后面只能跟一个 thunk 函数或 promise 对象,而 await 后面可以是任何类型(不是 Promise 对象就同步执行)返回值是一个 Promise 对象,不是 Iterator ,比 Generator 方便我们可以实现这样的一个 async 函数:});try{});});});});});我们使用 async 函数做点简单的事情:});

m0_56175058的博客 1050

Ubuntu16.04下禁用scp、sftp和winscp

在上一篇博文《Ubuntu16.04 搭建FTP服务器,设置用户权限为只许上传、禁止下载和删除》中,我讲述了Ubuntu16.04下配置FTP,并且设定用户权限为只能上传数据,禁止下载和删除数据。这算在FTP层面封堵了服务器数据泄露的途径。 但是,Ubuntu系统的scp和sftp还是起作用的,理论上只要能用本地机器ping通服务器,就可以用scp和sftp下载数据,这还是存在数据泄露可能的,所...

HPC&Geophysics攻城狮 5736

ECMAScript编写异步任务

一、基本的异步任务 JavaScript中编写异步任务使用的就是回调函数,如下面的例子: setTimeout(() => { callback() }, 1000); 这个例子是最简单的一个异步任务的例子:在1秒钟后执行回调函数 但是这种编写异步任务会有一个问题,就是容易产生回调地狱,因此提出使用下面的一些方式解决。 二、使用Promise编写异步任务以及Promise的A...

Fairy的博客 465

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图)

本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。

g9h0i1的博客 592

从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境

本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。

weixin_26878995的博客 489

理解ECMAScript的异步编程

一、什么是异步编程二、单线程和多线程三、EcmaScript的异步编程四、理解ES5、ES6、ES7不同版本实现异步编程的方法    1、ES5实现异步编程的方法:回调    2、ES6实现异步编程的方法:Promise或Generator/yield    3、ES7实现异步编程的方法:async/await    4、express实现异步编程的方法:    6、koa2实现异步编程的方法:参...

调皮的写代码 564

手把手教你学Simulink——基于Simulink的电压型 vs 电流型整流器性能对比

摘要:本文基于Simulink平台对比分析了电压型整流器(VSR)和电流型整流器(CSR)的性能差异。VSR采用电容滤波,具有高功率因数(PF>0.99)、低输入电流THD(<3%)等优势,但动态响应较慢;CSR采用电感滤波,动态响应快(<0.05s),但THD较高(5%~8%)。研究建立了统一测试平台,详细对比了两者在稳态性能、动态响应、效率等方面的差异,并给出了控制算法实现和参数优化建议。通过量化分析,为电力电子工程师提供了拓扑选型依据,可根据恒压/恒流需求选择最优方案,有效缩短开发周

MHD0815的博客 172

ECMAScript中的同步和异步

简介 首先了解JavaScript是单线程语言,做任何事情的时候都是一条流水线(单线程)。 同步和异步的区别就是在这个流水线上执行顺序不同。 最基础的异步是setTimeout和setInterval函数。改变了程序正常的执行顺序。 因为JavaScript是单线程。意味着,所有的任务执行都是需要排队的。前一个任务结束之后,下一个任务才能够开始。如果前一个任务消耗的时长过长,后一个任务就不得不一直等待。因此引入‘任务队列’这个概念。任务又可以分成两种,一种是同步任务,一种是异步任务。 同步任务 同步任务.

往事不回头,余生不将就 1万+

黑猫带你学UFS协议第8篇:UFS电气特性详解(Power、CLK、Reset等)

UFS强制支持secure mode。UFS设备可能会存储个人或者公司的信息,UFS提供把数据永久从设备上移除的功能,并且保证对存储介质进行逆向恢复数据也恢复不回来原有数据。安全模式是以逻辑单元为单位进行应用的,不同的逻辑单元可以有不同的安全模式。由于UFS设备的存储介质不同,所以把数据安全从存储介质上移除方式会有不同,spec提供了三种通用的移除方法,UFS设备至少支持其中一种。● 对存储的位置进行一次擦除操作。● 对存储的位置使用单一字符(比如0xAA)覆盖写,然后进行擦除。.........

黑猫奥利奥的博客 4076

【WorkBuddy专栏28】WorkBuddy 网页抓取完全实战——从翻车到行云流水

WorkBuddy 网页抓取完全实战——从翻车到行云流水

AI人人懂 1058

ECMAScript的异步编程

一、“异步模式”一共有4种方法,这4种方法可以写出结构更合理,性能更出色,维护更方便的js代码。这四种模式分别为:一、回调函数(callback)        二、事件监听(Listener)三、观察者模式;四、promise对象...

调皮的写代码 397

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ECMAScript (3)异步编程与元编程核心讲解

本文系统讲解了ECMAScript中的异步编程与元编程技术。异步编程部分介绍了回调函数、Promise、async/await等主流解决方案,以及Generator函数和ES2025新特性Promise.try(),通过实例展示了网络请求、文件读写等应用场景。元编程部分重点阐述了Proxy和Reflect的用法,包括数据验证、对象监听等实践案例。全文深入浅出地解析了JavaScript处理异步任务和操作程序本身的核心机制,为开发者提供了实用的技术指南。

人工智能全栈工程师 | 智能算法研发与实战落地​专注于人工智能算法研究、代码实现与工程落地,提供从模型设计到部署应用的全流程解决方案。 1043

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ECMAScript-异步编程-Promise

文章目录一、 ECMAScript-异步编程-Promise1. MDN定义2. Promise的几种状态3. 相关静态方法4. 相关案例5. 使用promise来改造ajax 一、 ECMAScript-异步编程-Promise 1. MDN定义 Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。 一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。 这样使得异步方法可以像

东东爱编码博客 271

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ECMAScript:《深入掌握ECMAScript 6 异步编程》

Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义与用法 async函数的含义与用法

chenxuanhanhao的专栏 618

小白学习ECMAScript 6 基础(箭头函数,面向对象class语法,Promise与异步编程)

Promise是ES6中引入的一种新的异步编程模型。Promise表示一个尚未完成但预计在未来会完成的操作的结果。本文将介绍ES6中的三个基础特性:箭头函数、面向对象class语法和Promise与异步编程。而在箭头函数中,this值继承自外部作用域的this值。使用class关键字可以定义一个类,类中可以包含属性和方法。与传统的构造函数相比,class语法更加简洁和易于理解。箭头函数是ES6中引入的一种新的函数语法。与传统的函数表达式不同,箭头函数具有更简洁的语法和自动绑定this值的特性。

m0_65006016的博客 423

ECMAScript-异步编程-Generator

文章目录一、ECMAScript-异步编程-Generator1. Generator的定义2. Generator的输出yield和执行next3. 发送异步请求 一、ECMAScript-异步编程-Generator 1. Generator的定义 // *符号 function * generator(){ //... } 2. Generator的输出yield和执行next function * foo() { for(let i = 0; i < 3; i++) {

东东爱编码博客 193

ECMASCRIPT6的异步编程解决方案

ES6提供了三种异步解决: Promise Generator Async

liuqi332922337的专栏 704

如何快速掌握Async/Await:ECMAScript异步编程的完整入门教程

Async/Await是ECMAScript提供的异步编程语法糖,它建立在Promise基础之上,让开发者能够用同步的方式编写异步代码。本教程将帮助你快速理解并掌握这一强大特性,告别回调地狱,写出更清晰、更易维护的JavaScript异步逻辑。 ## 🚀 为什么选择Async/Await? 在Async/Await出现之前,JavaScript异步编程主要依赖回调函数和Promise。虽然P

gitblog_00748的博客 432

ECMAScript 6 异步编程

http://www.ruanyifeng.com/blog/2015/04/generator.html 转载于:https://www.cnblogs.com/xiaomili/p/6668204.html

XYLH2015的博客 150

ECMAScript-异步编程-前置

文章目录一、ECMAScript-异步编程-前置1. JS是单线程的2. 同步任务 与 异步任务3. Ajax原理4. Callback Hell 【回调深渊,回调地狱】 一、ECMAScript-异步编程-前置 1. JS是单线程的 ​ 一个时间点,只能处理一个任务。 2. 同步任务 与 异步任务 同步任务:JS在执行代码的时候,是从上往下,依次执行的。 异步任务:当执行的代码,需要延迟一段时间,再来处理相应结果的任务。 比如:延迟,网络请求 细节:setTimeout() 默认时间是4ms,其

东东爱编码博客 160

ECMAScript Async/Await提案:彻底改变JavaScript异步编程的终极指南

ECMAScript Async/Await提案为JavaScript带来了革命性的异步编程模型,让开发者能够以同步代码的简洁风格编写异步操作。作为ECMAScript标准的重要扩展,这一特性彻底改变了JavaScript处理异步任务的方式,使代码更易读、更易维护。 ## 为什么需要Async/Await?异步编程的演进历程 🚀 JavaScript作为单线程语言,从诞生之初就面临着异步编程

gitblog_00223的博客 400

ECMAScript6(16):异步编程

ECMAScript6 (1):块级作用域 ECMAScript6 (2):解构赋值 ECMAScript6 (3):数值类型扩展 ECMAScript6 (4):字符串类型扩展 ECMAScript6 (5):函数的扩展 ECMAScript6 (6):数组的扩展 ECMAScript6 (7):二进制数组 ECMAScript6 (8):对象的扩展 ECMAScript6 (9)

FareBlog 1169

JavaScript异步编程(1)- ECMAScript 6的Promise对象

JavaScript的Callback机制深入人心。而ECMAScript的世界同样充斥的各种异步操作(异步IO、setTimeout等)。异步和Callback的搭载很容易就衍生"回调金字塔"。——由此产生Deferred/Promise。 Deferred起源于Python,后来被CommonJS挖掘并发扬光大,得到了大名鼎鼎的Promise,并且已经纳入ECMAScript 6(Jav...

weixin_30770495的博客 96

【ECMAScript 从入门到进阶教程】第二部分:中级概念(面向对象编程,异步编程,模块化,try/catch 语句)

ES6 模块(ESM)是目前最推荐使用的模块方案,因为它是 JavaScript 的原生模块系统,具有静态分析的优势,并在现代浏览器中得到了广泛的原生支持。与 CommonJS 和 AMD 相比,ES6 模块提供明确的语法和模块依赖关系,有助于更好的代码优化和性能提升。然而,了解 CommonJS 和 AMD 仍然很重要,因为它们在很多现有项目中广泛使用。尤其是当你在处理大量遗留代码或使用需要这些模块系统的第三方库时,这些知识就显得尤为重要。

1531

第十一章——期约与异步函数(上)——异步编程、期约

ECMAScript 6及之后的几个版本逐步加大了对异步编程机制的支持,提供了令人眼前一亮的新特性。ECMAScript 6新增了正式的Promise(期约)引用类型,支持优雅地定义和组织异步逻辑。接下来几个版本增加了使用async和await关键字定义异步函数的机制。

weixin_52878347的博客 1392
上一篇: Vue基于Webpack的相关目录及配置解读
下一篇: 前端路由&vue-router部分解读
DoubleSRZee
博客等级 码龄10年 7粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值