我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript异步解决方案有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript异步解决方案有哪些

这篇文章主要介绍“JavaScript异步解决方案有哪些”,在日常操作中,相信很多人在JavaScript异步解决方案有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript异步解决方案有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1.回调

回调简单地理解为一个函数作为参数传递给另一个函数,回调是早期最常用的异步解决方案之一。

回调不一定是异步的,也不直接相关。

举个简单的例子:

function f1(cb) {  setTimeout(() => {    cb && cb();  }, 2000);} f1(() => {  console.log("1");});

如上,我们在函数f1中使用setTimeout模拟一个耗时2s的任务,在耗时任务结束时抛出回调,这样我们就可以调用它,让回调函数在耗时结束时执行函数 f1 中的任务。

这样,我们就把同步操作变成了异步操作。f1不会阻塞程序,相当于先执行程序的主要逻辑,推迟执行耗时操作。

回调的优点和缺点

优点:简单,容易理解。

缺点:代码不优雅,可读性差,不易维护,耦合度高,层层嵌套造成回调地狱。

2.事件监听(发布订阅模式)

发布-订阅模式定义了对象之间一对多的依赖关系,这样当一个对象的状态发生变化时,所有依赖它的对象都会得到通知。

我们都使用过发布-订阅模式,例如,如果我们将事件函数绑定到 DOM 节点。

document.body.addEventListener('click', function () {  console.log('click');})

但这只是发布-订阅模式最简单的使用,在很多场景下我们往往会使用一些自定义事件来满足我们的需求。

有很多方法可以实现发布-订阅模式,所以这里有一个使用类的简单实现。

class Emitter {  constructor() {    // _listener array, key is the custom event name, value is the execution callback array - as there may be more than one    this._listener = []  }   // 订阅 监听事件  on(type, fn) {    // Determine if the event exists in the _listener array.    // Exists to push the callback to the value array corresponding to the event name, does not exist to add directly    this._listener[type]       ? this._listener[type].push(fn)      : (this._listener[type] = [fn])  }   // Publish Trigger Event  trigger(type, ...rest) {    // Determine if the trigger event exists    if (!this._listener[type]) return    // Iterate through the array of callbacks executing the event and pass the parameters    this._listener[type].forEach(callback => callback(...rest))  }}

如上所示,我们创建了一个 Emitter 类,并在和触发器上添加了两个原型方法,使用如下。

// Create an emitter instanceconst emitter = new Emitter() emitter.on("done", function(arg1, arg2) {  console.log(arg1, arg2)}) emitter.on("done", function(arg1, arg2) {  console.log(arg2, arg1)}) function fn1() {  console.log('I am the main program')  setTimeout(() => {    emitter.trigger("done", "Asynchronous parameter I", "Asynchronous parameter II")  }, 1000)} fn1()

我们先创建一个emitter实例,然后注册事件,然后触发事件,这样也解决了异步问题。

事件监听的优点和缺点

优点:更符合模块化思想,我们在编写自己的监听器的时候可以做很多优化,从而更好的监听程序的运行。

缺点:整个程序变成了事件驱动,或多或少影响了流程,而且每次使用都要注册事件监听器然后触发,比较麻烦,代码也不是很优雅。

3.Promise

ES6 标准化并引入了 Promise 对象,这是一种异步编程的解决方案。

简单的说,就是用同步的方式写异步代码,可以用来解决回调地狱问题。

Promise对象的状态一旦改变,就不会再改变,只有两种可能的改变。

  1. 由待定改为已解决。

  2. 由Pending改为Rejected。

我们使用 setTimeout 来模拟异步操作。

function analogAsync(n) {  return new Promise((resolve) => {    setTimeout(() => resolve(n + 500), n);  });} function fn1(n) {  console.log(`step1 with ${n}`);  return analogAsync(n);} function fn2(n) {  console.log(`step2 with ${n}`);  return analogAsync(n);} function fn3(n) {  console.log(`step3 with ${n}`);  return analogAsync(n);}

使用 Promise 来实现。

function fn() {  let time1 = 0;  fn1(time1)    .then((time2) => fn2(time2))    .then((time3) => fn3(time3))    .then((res) => {      console.log(`result is ${res}`);    });} fn();

Promise 优点和缺点

优点:Promise以同步的方式编写异步代码,避免了回调函数层层嵌套,可读性更强。链式操作,可以在then中继续写Promise对象并return,然后继续调用then进行回调操作。

缺点:Promise对象一旦创建就会立即执行,不能中途取消。如果没有设置回调函数,Promise 会在内部抛出错误,不会向外流。

4.Generator

Generator其实就是一个函数,只不过是一个特殊的函数。Generator 的特别之处在于它可以中途停止。

function *generatorFn() {  console.log("a");  yield '1';  console.log("b");  yield '2';   console.log("c");  return '3';} let it = generatorFn();it.next();it.next();it.next();it.next();

上面的示例是一个具有以下特征的生成器函数。与普通函数不同,Generator 函数在函数之后和函数名称之前有一个 *,该函数有一个内部 yield 字段,函数调用后的返回值使用next方法。

Generator的优点和缺点

优点:优雅的流程控制方法,允许函数被中断地执行。

缺点:Generator函数的执行必须依赖executor,对于只做异步处理还是不太方便。

5.async/await

ES2017标准引入了async函数,使得异步操作更加方便。async是异步的意思,await是async wait的简写,也就是异步等待。async/await 被许多人认为是 js 中异步操作的终极和最优雅的解决方案。

异步在做什么?

async 函数返回一个 Promise 对象。如果直接在 async 函数中返回一个直接量,async 会通过 Promise.resolve() 将直接量包装在一个 Promise 对象中。

await 是什么?

await 是一个表达式,其计算结果为 Promise 对象或其他值(换句话说,没有特殊限定,无论如何)。

如果 await 后面没有跟 Promise 对象,则直接执行。

如果 await 后面跟着一个 Promise 对象,它会阻塞后面的代码,Promise 对象解析,然后获取 resolve 的值作为 await 表达式的结果。

await 只能在异步函数中使用

上面使用setTimeout来模拟异步操作,我们使用async/await来实现。

async function fn() {  let time1 = 0;  let time2 = await fn1(time1);  let time3 = await fn2(time2);  let res = await fn3(time3);  console.log(`result is ${res}`);} fn();

输出结果和上面的 Promise 实现是一样的,但是 async/await 的代码结构看起来更清晰,几乎和同步写法一样优雅。

async/await的优点和缺点

优点:内置执行器,语义更好,适用性更广。

缺点:误用 await 可能会导致性能问题,因为 await 会阻塞代码。

到此,关于“JavaScript异步解决方案有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript异步解决方案有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript异步解决方案有哪些

这篇文章主要介绍“JavaScript异步解决方案有哪些”,在日常操作中,相信很多人在JavaScript异步解决方案有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript异步解决方案有哪些
2023-07-05

总结5种JavaScript异步解决方案

这篇文章主要讲解了JavaScript异步解决处理方案,文章中有详细的解决方案和代码示例,需要的朋友参考一下
2023-05-15

JavaScript 异步编程指南 — 解决方案 Async/Await

ES7 之后引入了 Async/Await 解决异步编程,这种方式在 JavaScript 异步编程中目前也被称为 “终极解决方案”。

数据库数据同步解决方案有哪些

1. 数据库复制:通过复制主数据库的数据到备份数据库中,实现数据同步。2. 数据库镜像:在多个数据库服务器之间进行数据同步,镜像服务器可以实时将主服务器上的数据复制到备份服务器上,实现数据同步。3. 数据库备份与还原:通过定期备份主数据库,
2023-06-10

javascript中实现异步编程的方法有哪些

javascript中实现异步编程的方法有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。javascript异步编程的4种方法:1、回调函数,这是异步编程最
2023-06-14

JavaScript异步编程的最佳实践都有哪些?(JavaScript异步编程的最佳实践有哪些)

一、引言在JavaScript开发中,异步编程是一个非常重要的概念。随着Web应用的复杂性不断增加,异步操作变得越来越普遍。异步编程可以让我们在等待某些操作完成的同时,继续执行其他任务,从而提高应用的性能和响应性。然而,异步编程也带来了
JavaScript异步编程的最佳实践都有哪些?(JavaScript异步编程的最佳实践有哪些)
JavaScript2024-12-18

Go异步任务解决方案:Asynq

Asynq​ 使用 Redis​ 作为消息代理。client.go​ 和 main.go​ 都需要连接到 Redis​ 进行写入和读取。我们将使用 asynq.RedisClientOpt​ 指定如何连接到本地 Redis 实例。
Go异步任务2024-11-30

Java 中实现异步的方法有哪些?(java实现异步的方法有哪些)

在Java编程中,异步编程是一种非常重要的技术,它可以提高应用程序的性能和响应性。以下是一些常见的Java实现异步的方法:一、使用Future和CallableJava5引入了Future
Java 中实现异步的方法有哪些?(java实现异步的方法有哪些)
Java2024-12-14

云存储解决方案有哪些

1. 云存储服务商:像谷歌云存储、微软Azure等服务商提供的公共云存储解决方案。2. 私有云存储:组织可以在其自己的数据中心中创建私有云存储解决方案,这些解决方案可以根据组织的需求进行定制。3. 混合云存储:混合云存储是将公共和私有云存储
2023-06-08

私有云安全解决方案有哪些

1. 数据加密:对数据进行加密,保护数据的隐私和安全性。2. 访问控制:采用权限控制和身份验证机制,限制用户对数据的访问权限。3. 安全审计:对私有云环境中的所有操作进行监控和审计,及时发现和处理安全事件。4. 防火墙和入侵检测:使用防火墙
2023-06-08

java异步编程有哪些方式

本篇内容介绍了“java异步编程有哪些方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要异步?操作系统可以看作是个虚拟机(VM),
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录