广告
返回顶部
首页 > 资讯 > 精选 >JavaScript中的异步处理方法
  • 103
分享到

JavaScript中的异步处理方法

2023-06-17 04:06:00 103人浏览 泡泡鱼
摘要

本篇内容介绍了“javascript中的异步处理方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 JavaScript 的世界中,所有代

本篇内容介绍了“javascript中的异步处理方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在 JavaScript 的世界中,所有代码都是单线程执行的,由于这个“缺陷”,导致 JavaScript 的所有网络操作,浏览器事件,都必须是异步执行。

异步执行可以用回调函数实现。

异步操作会在将来的某个时间点触发一个函数调用。

主流的异步处理方案主要有:回调函数 (CallBack) 、 Promise 、 Generator 函数、 async/await 。

一、回调函数(CallBack)

这是异步编程最基本的方法

假设我们有一个 getData 方法,用于异步获取数据,***个参数为请求的 url 地址,第二个参数是回调函数,如下:

function getData(url, callBack){     // 模拟发送网络请求     setTimeout(()=> {         // 假设 res 就是返回的数据         var res = {             url: url,             data: Math.random()         }         // 执行回调,将数据作为参数传递         callBack(res)     }, 1000) }

我们预先设定一个场景,假设我们要请求三次服务器,每一次的请求依赖上一次请求的结果,如下:

getData('/page/1?param=123', (res1) => {     console.log(res1)     getData(`/page/2?param=${res1.data}`, (res2) => {         console.log(res2)         getData(`/page/3?param=${res2.data}`, (res3) => {             console.log(res3)         })     }) })
  • 通过上面的代码可以看出,***次请求的 url 地址为: /page/1?param=123 ,返回结果为 res1 。

  • 第二个请求的 url 地址为: /page/2?param=${res1.data} ,依赖***次请求的 res1.data ,返回结果为  res2`。

  • 第三次请求的 url 地址为: /page/3?param=${res2.data} ,依赖第二次请求的 res2.data ,返回结果为 res3  。

由于后续请求依赖前一个请求的结果,所以我们只能把下一次请求写到上一次请求的回调函数内部,这样就形成了常说的:回调地狱。

二、发布/订阅

我们假定,存在一个”信号中心”,某个任务执行完成,就向信号中心”发布”( publish )一个信号,其他任务可以向信号中心”订阅”( subscribe  )这个信号,从而知道什么时候自己可以开始执行。这就叫做”发布/订阅模式”(publish-subscribe  pattern),又称”观察者模式”(observer pattern)

这个模式有多种实现,下面采用的是Ben Alman的 Tiny Pub/Sub ,这是 Jquery 的一个插件

首先, f2 向”信号中心” jQuery 订阅” done “信号

jQuery.subscribe("done", f2);

f1进行如下改写

function f1(){ setTimeout(function(){ // f1的任务代码 jQuery.publish("done"); }, 1000); }

jQuery.publish("done") 的意思是, f1 执行完成后,向”信号中心 "jQuery 发布 "done" 信号,从而引发f2的执行。  此外,f2完成执行后,也可以取消订阅( unsubscribe )

jQuery.unsubscribe("done", f2);

这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。

三、Promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大

所谓 Promise ,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说, Promise  是一个对象,从它可以获取异步操作的消息。 Promise 提供统一的 api ,各种异步操作都可以用同样的方法进行处理

简单说,它的思想是,每一个异步任务返回一个 Promise 对象,该对象有一个 then 方法,允许指定回调函数。

现在我们使用 Promise 重新实现上面的案例,首先,我们要把异步请求数据的方法封装成 Promise

function getDataAsync(url){     return new Promise((resolve, reject) => {         setTimeout(()=> {             var res = {                 url: url,                 data: Math.random()             }             resolve(res)         }, 1000)     }) }

那么请求的代码应该这样写

getDataAsync('/page/1?param=123')     .then(res1=> {         console.log(res1)         return getDataAsync(`/page/2?param=${res1.data}`)     })     .then(res2=> {         console.log(res2)         return getDataAsync(`/page/3?param=${res2.data}`)     })     .then(res3=> {         console.log(res3)     })

then 方法返回一个新的 Promise 对象, then 方法的链式调用避免了 CallBack 回调地狱

但也并不是***,比如我们要添加很多 then 语句, 每一个 then 还是要写一个回调。

如果场景再复杂一点,比如后边的每一个请求依赖前面所有请求的结果,而不仅仅依赖上一次请求的结果,那会更复杂。 为了做的更好, async/await  就应运而生了,来看看使用 async/await 要如何实现

四、async/await

getDataAsync 方法不变,如下

 function getDataAsync(url){     return new Promise((resolve, reject) => {         setTimeout(()=> {             var res = {                 url: url,                 data: Math.random()             }             resolve(res)         }, 1000)     }) }

业务代码如下

async function getData(){     var res1 = await getDataAsync('/page/1?param=123')     console.log(res1)     var res2 = await getDataAsync(`/page/2?param=${res1.data}`)     console.log(res2)     var res3 = await getDataAsync(`/page/2?param=${res2.data}`)     console.log(res3) }

可以看到使用 async\await 就像写同步代码一样

对比 Promise 感觉怎么样?是不是非常清晰,但是 async/await 是基于 Promise 的,因为使用 async 修饰的方法最终返回一个  Promise , 实际上, async/await 可以看做是使用 Generator 函数处理异步的语法糖,我们来看看如何使用 Generator  函数处理异步

五、Generator

首先异步函数依然是

function getDataAsync(url){     return new Promise((resolve, reject) => {         setTimeout(()=> {             var res = {                 url: url,                 data: Math.random()             }             resolve(res)         }, 1000)     }) }

使用 Generator 函数可以这样写

function*getData(){     var res1 = yield getDataAsync('/page/1?param=123')     console.log(res1)     var res2 = yield getDataAsync(`/page/2?param=${res1.data}`)     console.log(res2)     var res3 = yield getDataAsync(`/page/2?param=${res2.data}`)     console.log(res3)) }

然后我们这样逐步执行

var g = getData() g.next().value.then(res1=> {     g.next(res1).value.then(res2=> {         g.next(res2).value.then(()=> {             g.next()         })     }) })

上面的代码,我们逐步调用遍历器的 next() 方法,由于每一个 next() 方法返回值的 value 属性为一个 Promise 对象

所以我们为其添加 then 方法, 在 then 方法里面接着运行 next 方法挪移遍历器指针,直到 Generator  函数运行完成,实际上,这个过程我们不必手动完成,可以封装成一个简单的执行器

function run(gen){     var g = gen()      function next(data){         var res = g.next(data)         if (res.done) return res.value         res.value.then((data) => {             next(data)         })     }      next()  }

run 方法用来自动运行异步的 Generator 函数,其实就是一个递归的过程调用的过程。这样我们就不必手动执行 Generator 函数了。 有了  run 方法,我们只需要这样运行 getData 方法

run(getData)

这样,我们就可以把异步操作封装到 Generator 函数内部,使用 run 方法作为 Generator 函数的自执行器,来处理异步。其实我们不难发现,  async/await 方法相比于 Generator 处理异步的方式,有很多相似的地方,只不过 async/await 在语义化方面更加明显,同时  async/await 不需要我们手写执行器,其内部已经帮我们封装好了,这就是为什么说 async/await 是 Generator  函数处理异步的语法糖了。

“JavaScript中的异步处理方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: JavaScript中的异步处理方法

本文链接: https://www.lsjlt.com/news/287006.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • JavaScript中的异步处理方法
    本篇内容介绍了“JavaScript中的异步处理方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 JavaScript 的世界中,所有代...
    99+
    2023-06-17
  • JavaScript异步处理的方式有哪些
    这篇“JavaScript异步处理的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2022-10-19
  • JavaScript中怎么处理异步
    JavaScript中怎么处理异步,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、回调函数回调是一个函数被作为一个参数传递到另一个函数里,在...
    99+
    2022-10-19
  • javascript实现异步的方法
    这篇文章给大家分享的是有关javascript实现异步的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。javascript实现异步的方法:1、使用setTimeout方法;2、使用setImmediate 方...
    99+
    2023-06-14
  • SpringBoot异步处理的方法有哪些
    小编给大家分享一下SpringBoot异步处理的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步请求与同步请求我们先通过一张图来区分一下异步请求和同步...
    99+
    2023-06-15
  • SpringMVC异步处理的方法有哪些
    这篇文章主要介绍SpringMVC异步处理的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!异步处理 demo如果要启用异步返回,需要开启 @EnableAsync。如下的代码中,使用 DeferredRes...
    99+
    2023-06-06
  • NodeJs通过async/await处理异步的方法
    场景 远古时代 我们在编写express后台,经常要有许多异步IO的处理。在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数。我们来模拟一个Mongo数据库的操...
    99+
    2022-06-04
    方法 NodeJs async
  • Nodejs异步回调的优雅处理方法
    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用。在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作...
    99+
    2022-06-04
    回调 优雅 方法
  • 异步的含义以及JavaScript异步编程的方法
    本篇内容主要讲解“异步的含义以及JavaScript异步编程的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“异步的含义以及JavaScript异步编程的方法...
    99+
    2022-10-19
  • 异步JavaScript编程中的Promise使用方法
    异步? 我在很多地方都看到过异步(Asynchronous)这个词,但在我还不是很理解这个概念的时候,却发现自己常常会被当做“已经很清楚”(* ̄? ̄)。 如果你也有类似的情况,没关系,搜索一下这个...
    99+
    2022-06-04
    使用方法 JavaScript Promise
  • JavaScript异步操作同步执行的方法
    本文小编为大家详细介绍“JavaScript异步操作同步执行的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript异步操作同步执行的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深...
    99+
    2022-10-19
  • java异步处理任务的方法是什么
    在Java中,有以下几种方法可以实现异步处理任务:1. 使用Thread类:可以通过创建一个新的Thread对象,并在其内部实现异步...
    99+
    2023-09-16
    java
  • django异步请求处理的方法是什么
    Django中的异步请求处理可以通过以下几种方法实现:1. 使用Django的内置异步任务处理机制:Django提供了一个名为`as...
    99+
    2023-09-26
    Django
  • golang异步任务处理的方法是什么
    在Go语言中,可以使用goroutine和channel来实现异步任务处理。 Goroutine:Goroutine是Go语言中轻...
    99+
    2023-10-27
    golang
  • ADO.NET数据异步处理的方法有哪些
    这篇文章主要介绍“ADO.NET数据异步处理的方法有哪些”,在日常操作中,相信很多人在ADO.NET数据异步处理的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET数据异步处理的方法有哪些...
    99+
    2023-06-17
  • JavaScript中Promise处理异步的并行与串行
    目录一、异步的“并行” 并行中的综合处理二、异步的“串行”:2.1 then链机制处理2.2 真实项目中,想实现异步的串行,...
    99+
    2022-12-19
    promise串行和并行 js promise的用法总结 promise串行执行
  • js异步处理方案,js的异步串行与异步并行
    目录js异步处理方案,js的异步串行与异步并行一、什么是串行,并行,并发二、实现异步串行三、实现异步并行js异步处理方案,js的异步串行与异步并行 一、什么是串行,并行,并发 串行:...
    99+
    2023-03-24
    javascript异步处理 js异步串行与并行
  • springevent事件异步处理方式(发布,监听,异步处理)
    目录spring event 事件异步处理(发布,监听,异步处理)spring事件之异步线程执行Spring 事件发布监听的多种实现异步方法解决方案总结spring event 事件...
    99+
    2023-02-14
    spring event事件异步 event事件发布 event事件监听 event事件异步处理
  • RUST异步流处理方法详细讲解
    目录Stream 特质yield 匿名流try_joinselectSELECT宏几个条件async 问号使用Send traitStream 特质 在同步Rust 中流的...
    99+
    2022-12-16
    RUST异步流处理 RUST流处理
  • JavaScript中实现异步编程模式的方法
    小编给大家分享一下JavaScript中实现异步编程模式的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript中实现异步编程模式的方法:1、回调函数,这是异步编程最基本的方法;2、事件监听;3、发布或订阅...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作