JavaScript中的异步编程

异步编程,是JavaScript编程中重要的一部分,最近学习了阮一峰老师的《深入掌握 ECMAScript 6 异步编程》系列文章,特意输出一篇学习笔记。

传统的四种异步编程方法

回调函数

JavaScript 语言对异步编程的实现,就是回调函数。所谓回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。

假设有三个函数f1f2f3f2需要等待f1的执行结果,这时最简单的方法就是把f2写成f1的回调函数:

function f1(callback){setTimeout(()=>{console.log(1);callback();},1000);
};function f2(){console.log(2);
}function f3(){console.log(3);
}f1(this.f2);
f3();

回调函数是异步编程最基本的方法,通过这种方法,函数f1不会阻塞程序的运行,相当于先执行程序的主要逻辑,将耗时的操作推迟执行。

事件监听

JavaScript 事件处理是异步的。在 JavaScript 中,事件监听器会被添加到事件队列,等待主执行线程的处理。当主线程空闲时,事件队列中的事件会按顺序被执行。因此,事件回调函数不会阻塞主线程,也不会导致页面假死。

事件驱动模式,这种方法的优点是比较容易理解,并且可以同时绑定多个事件,每个事件可以指定多个回调函数,有利于实现模块化。

发布/订阅

这种异步编程是通过发布/订阅模式来实现的,这种方法的性质与“事件监听”类似。

这是一种广泛应用于异步编程的模式,是回调函数的事件化,常常用来解耦业务逻辑。事件的发布者无需关注订阅的侦听器如何实现业务逻辑,甚至不用关注有多少个侦听器存在。数据通过消息的方式可以灵活的传递。 ——《深入浅出Nodejs》

Promises对象

Promises是一个对象,它为异步编程提供了一个统一的接口,关于Promise的详细解释,我曾经做过一个很详细的用法说明。

使用Promises对象实现异步编程时,每一个异步任务返回一个Promise对象,该对象有一个then方法,开发者可以在then方法中指定回调函数。

还是以函数f1f2f3为例子,这是后的代码就应该是下面这个样子:

function f1(){var a = new Promise((res, rej) => {setTimeout(() => {console.log(1);res('1 done');}, 1000);});return a;
};function f2(){console.log(2);
}function f3(){console.log(3);
}f1().then(() => {this.f2();
})
f3();

和前面几种方法相比,Promise的回调函数变成了链式写法,而且Promises对象有一整套的配套方法,可以实现很多强大的功能。

ECMAScript 6中的四种异步编程方法

Generator函数

Generator函数最大的特点就是可以暂停执行,它和普通函数的在写法上有两个区别:

  • 在函数名之前加星号以示区别
  • 异步操作需要暂停的地方,使用yield语句注明
function* gen(x){var y = yield x + 2;return y;
}
var g = gen(1);
g.next() // { value: 3, done: false }
g.next() // { value: undefined, done: true }

使用星号标记以后,整个Generator函数就是一个封装的异步任务,yield语句就是异步操作要暂停的地方。

和普通函数不同的是,Generator函数执行之后返回的是一个指针对象,而不是return的值

上面的代码中,var g = gen(1);调用Generator函数会返回一个内部指针g。指针g有一个next方法,会执行异步任务的第一阶段(既指针指向内部的第一个yield语句)。next方法会返回一个对象,表示当前阶段的信息(value属性和done属性),其中value属性指的是当前yield语句后面表达式的值,done属性是一个布尔值,表示当前Generator函数是否执行完毕。

Generator函数的数据交换和错误处理

用Generator函数来处理异步编程的原因,是因为它有暂停执行和恢复执行的能力,并且Generator函数有两个特性:函数体内外数据交换机制和错误处理机制。

内外数据交换

next方法的返回值是一个对象,对象中有一个value属性,这个value属性就是Generator函数向函数体外部输出的数据。

同时,next方法也可以接受一个参数,这个参数就是向Generator函数体内输入的数据,

function* gen(x){var y = yield x + 2;return y;
}var g = gen(1);
g.next() // { value: 3, done: false }
g.next(2) // { value: 2, done: true }
console.log(y) // 2
错误处理机制
function* gen(x){try {var y = yield x + 2;} catch (e){ console.log(e);}return y;
}var g = gen(1);
g.next();
g.throw('出错了')// 出错了

async函数

async函数是一种Generator函数的语法糖。和前面的Generator函数相比,在写法上async函数就是将星号替换成了async,将yield替换成了await:

async function gen(x){var y = await x + 2;return y;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的< resultMap >标签的简析

<resultMap> 标签的作用是用于配置数据库表和实体类之间的映射关系&#xff0c;定义查询结果集与实体类的属性之间的映射关系。它定义了 SQL 查询语句在返回结果集合时&#xff0c;如何将列名和属性名匹配起来&#xff0c;并将结果封装进一个指定的对象中。在 MyBatis 中…

设计模式-状态模式

介绍 一个对象有状态变化每次状态变化都会触发一个逻辑不能总是用if else来控制 示例 交通信号灯不同颜色的变化 UML类图 传统UML类图 简化后的UML类图 代码演示 // 状态&#xff08;红灯、绿灯、黄灯&#xff09; class State {constructor(color) {this.color col…

软件工程概论

文章目录 软件的定义软件的特点软件的种类软件工程的起源软件工程的三个阶段软件工程概念的提出软件开发的本质软件工程框架软件工程的目标软件工程的原则软件工程的活动 软件的定义 计算机系统中的程序及其文档。 程序是计算任务的处理对象和处理规则的描述&#xff1b; 文档…

SQL基本语法用例大全

文章目录 SQL语法概述简单查询计算列查询条件查询范围查询使用逻辑运算符过滤数据使用IN操作符过滤数据格式化结果集模糊查询行数据过滤数据排序数据统计分析分组总计简单子查询多行子查询多表链接插入数据更新和删除数据使用视图数据库管理数据表管理 SQL语法概述 SQL(Struct…

腾讯云优惠券种类、领取方法及使用教程分享

腾讯云是国内领先的云计算服务提供商&#xff0c;为用户提供丰富的云计算产品和服务。为了吸引更多用户使用腾讯云的产品和服务&#xff0c;腾讯云会定期推出各种优惠券活动。本文将为大家介绍腾讯云优惠券的种类、领取方法及使用教程。 一、腾讯云优惠券种类介绍 腾讯云优惠券…

Ubuntu的中文乱码问题

一、Ubuntu的中文乱码问题 sudo apt-get install language-pack-zh-hans 二、修改/etc/environment&#xff08;在文件的末尾追加&#xff09;&#xff1a; LANG"zh_CN.UTF-8" LANGUAGE"zh_CN:zh:en_US:en" 三、修改/var/lib/locales/supported.d/loca…

“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“

目录 第一单元&#xff1a;二十一世纪程序执行 背景: 总结&#xff1a; 第二单元:对象导向与类别设计 背景: 总结&#xff1a; 第三单元&#xff1a;使用类别与基底类别库 背景: 总结: 第四单元:Windows开发程序 背景: 总结: 第五单元:防护式程序设计 背景: 总结…

SXSSFWorkbook-MinIo-大数据-流式导出

文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言 由于业务涉及到数据比较大&#xff0c;用户对导出功能使用频繁&#xff0c;每次导出数据两10万以上。 为了减少数据库压力&#xff0c;及应用服务器…

代理IP端口是什么意思呢?

今天&#xff0c;咱们来聊聊一个小众但很有料的话题——代理IP端口&#xff0c;它可是你纵横互联网世界的好搭子哦&#xff01; 首先&#xff0c;我们得先弄明白&#xff0c;代理IP端口是个啥? 代理IP端口就像是通往网络世界的门票&#xff0c;是你和代理服务器之间的桥梁。…

API接口安全运营研究(内附官方开发平台api接口接入方式)

摘 要 根据当前API技术发展的趋势&#xff0c;从实际应用中发生的安全事件出发&#xff0c;分析并讨论相关API安全运营问题。从风险角度阐述了API接口安全存在的问题&#xff0c;探讨了API检测技术在安全运营中起到的作用&#xff0c;同时针对API安全运营实践&#xff0c;提出…

关于系统/网络运维面试经验总结

一. 熟悉Linux命令 1. 最最最常问到的是 如何查看系统内存占用情况&#xff1f; ① free命令&#xff1a;free [-h][-m] 显示系统的内存使用情况&#xff0c;包括总内存、已使用内存、空闲内存等信息。其中&#xff0c;-m选项是以MB为单位来展示内存使用信息&#xff1b;-h选…

Ubuntu-Ports更新源 ARM64更新源

Ubuntu-Ports更新源 Ubuntu ARM64更新源 简介&#xff1a; Arm64&#xff0c;Armhf等平台的Ubuntu软件仓库。 Ubuntu-Ports国内镜像源 华为镜像Ubuntu-Ports 阿里云镜像Ubuntu-Ports 清华大学镜像Ubuntu-Ports 改用清华大学镜像更新源 Ubuntu 的软件源配置文件是 /etc/ap…

办公室人人在用的iTab桌面真的好用吗?

本人坐标北京&#xff0c;在一家中型互联网公司当社畜多年。最近发现一个奇怪的现象&#xff0c;我工位前后左右的同事都跟我在用一样的浏览器桌面——iTab新标签页。我表示莫非真的英雄所见略同&#xff1f; 我是去年1月份在刷B站时偶然刷到一条评论&#xff0c;有人分享自己…

日语学习网站web项目

支持日语五十音,平片假名、罗马音、词义转换、百度翻译功能,方便日语初学者学习日语发音 介绍 采用vitevue3ts技术栈开发, pinia管理全局化。主要是为了日语入门学习五十音, 以及日语句子罗马 发音对照练习。 参考以下两个项目完成 https://github.com/hexenq/kuroshiro ht…

【算法作业记录】

插入排序 递归实现 直接插入 #将a[n]插入有序区间a[0,n-1]中 时间复杂度 O&#xff08;n&#xff09; def Insert(a,n):inwhile(i>0 and a[i-1]>a[i]):tmpa[i]a[i]a[i-1]a[i-1]tmpi-1return #直接插入排序 def Insertsort(a,n):for i in range(1,n):#【1&#xff0c;n-…

AM@数列极限

文章目录 abstract极限&#x1f47a;极限的主要问题 数列极限数列极限的定义 ( ϵ − N ) (\epsilon-N) (ϵ−N)语言描述极限表达式成立的证明极限发散证明常用数列极限数列极限的几何意义例 函数的极限 abstract 数列极限 极限&#x1f47a; 极限分为数列的极限和函数的极限…

卫星/RedCap/高算力/解决方案/创新金奖……移远通信为IOTE 2023再添新活力

9月20日&#xff0c;IOTE 2023第二十届国际物联网展深圳场震撼来袭。 作为IOTE多年的“老朋友”&#xff0c;移远通信在参展当天&#xff0c;不仅有5G RedCap、卫星通信、高算力、车载等高性能产品及终端展出&#xff0c;还携智慧出行、智慧生活、智慧能源、工业互联网等多领域…

基于http的protobuf服务实现

本文介绍在http协议中&#xff0c;使用protobuf格式进行二进制数据通信。双方需设置http的header中ContentType为application/x-protobuf。 1、springboot下实现protobuf&#xff1a; 1&#xff09;pom.xml <dependency><groupId>org.springframework.boot</g…

SettingsView/设置页 的实现

1. 创建设置视图 SettingsView.swift import SwiftUI/// 设置页面 struct SettingsView: View {/// 环境变量&#xff0c;呈现方式&#xff1a;显示或者关闭Environment(\.presentationMode) var presentationMode/// 默认网址let defaultURL URL(string: "https://www.…

淘宝天猫商品历史价格API接口

获取淘宝商品历史价格接口的步骤如下&#xff1a; 注册淘宝开放平台&#xff1a;首先在淘宝开放平台上注册一个账号&#xff0c;并进行登录。创建应用&#xff1a;在淘宝开放平台上创建一个应用&#xff0c;并获取该应用的App Key和App Secret&#xff0c;用于后续的接口调用。…