位置: 编程技术 - 正文

深入理解JavaScript编程中的同步与异步机制(深入理解中国式现代化)

编辑:rootadmin

推荐整理分享深入理解JavaScript编程中的同步与异步机制(深入理解中国式现代化),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解新发展理念,推进供给侧结构性改革 心得体会,深入理解新发展理念,深入理解javascript特性,深入理解计算机系统,深入理解新发展理念,深入理解javascript,深入理解javascript,深入理解javascript特性,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript的优势之一是其如何处理异步代码。异步代码会被放入一个事件队列,等到所有其他代码执行后才进行,而不会阻塞线程。然而,对于初学者来说,书写异步代码可能会比较困难。而在这篇文章里,我将会消除你可能会有的任何困惑。理解异步代码

JavaScript最基础的异步函数是setTimeout和setInterval。setTimeout会在一定时间后执行给定的函数。它接受一个回调函数作为第一参数和一个毫秒时间作为第二参数。以下是用法举例:

正如预期,控制台先输出“a”、“b”,大约毫秒后,再看到“c”、“d”、“e”。我用“大约”是因为setTimeout事实上是不可预知的。实际上,甚至 HTML5规范都提到了这个问题:

“这个API不能保证计时会如期准确地运行。由于CPU负载、其他任务等所导致的延迟是可以预料到的。”

有趣的是,直到在同一程序段中所有其余的代码执行结束后,超时才会发生。所以如果设置了超时,同时执行了需长时间运行的函数,那么在该函数执行完成之前,超时甚至都不会启动。实际上,异步函数,如setTimeout和setInterval,被压入了称之为Event Loop的队列。

Event Loop是一个回调函数队列。当异步函数执行时,回调函数会被压入这个队列。JavaScript引擎直到异步函数执行完成后,才会开始处理事件循环。这意味着JavaScript代码不是多线程的,即使表现的行为相似。事件循环是一个先进先出(FIFO)队列,这说明回调是按照它们被加入队列的顺序执行的。JavaScript被 node选做为开发语言,就是因为写这样的代码多么简单啊。

Ajax

异步Javascript与XML(AJAX)永久性的改变了Javascript语言的状况。突然间,浏览器不再需要重新加载即可更新web页面。 在不同的浏览器中实现Ajax的代码可能漫长并且乏味;但是,幸亏有jQuery(还有其他库)的帮助,我们能够以很容易并且优雅的方式实现客户端-服务器端通讯。

我们可以使用jQuery跨浏览器接口$.ajax很容易地检索数据,然而却不能呈现幕后发生了什么。比如:

较容易犯的错误,是在调用$.ajax之后马上使用data,但是实际上是这样的:

底层的XmlHttpRequest对象发起请求,设置回调函数用来处理XHR的readystatechnage事件。然后执行XHR的send方法。在XHR运行中,当其属性readyState改变时readystatechange事件就会被触发,只有在XHR从远端服务器接收响应结束时回调函数才会触发执行。

处理异步代码

异步编程很容易陷入我们常说的“回调地狱”。因为事实上几乎JS中的所有异步函数都用到了回调,连续执行几个异步函数的结果就是层层嵌套的回调函数以及随之而来的复杂代码。

node.js中的许多函数也是异步的。因此如下的代码基本上很常见:

下面的客户端代码也很多见:

Nested callbacks can get really nasty, but there are several solutions to this style of coding.

深入理解JavaScript编程中的同步与异步机制(深入理解中国式现代化)

嵌套的回调很容易带来代码中的“坏味道”,不过你可以用以下的几种风格来尝试解决这个问题

The problem isn't with the language itself; it's with the way programmers use the language — Async Javascript.

没有糟糕的语言,只有糟糕的程序猿 ——异步JavaSript

命名函数

清除嵌套回调的一个便捷的解决方案是简单的避免双层以上的嵌套。传递一个命名函数给作为回调参数,而不是传递匿名函数:

此外, async.js 库可以帮助我们处理多重Ajax requests/responses. 例如:

这段代码执行两个异步函数,每个函数都接收一个名为"done"的回调函数并在函数结束的时候调用它。当两个"done"回调函数结束后,parallel函数的回调函数被调用并执行或处理这两个异步函数产生的结果或错误。

Promises模型引自 CommonJS/A:

promise表示一个操作独立完成后返回的最终结果。

有很多库都包含了promise模型,其中jQuery已经有了一个可使用且很出色的promise API。jQuery在1.5版本引入了Deferred对象,并可以在返回promise的函数中使用jQuery.Deferred的构造结果。而返回promise的函数则用于执行某种异步操作并解决完成后的延迟。

这允许你执行两个异步函数后,等待它们的结果,之后再用先前两个调用的结果来执行另外一个函数。

promise表示一个操作独立完成后返回的最终结果。

在这段代码里,geocode方法执行了两次并返回了一个promise。异步函数之后执行,并在其回调里调用了resolve。然后,一旦两次调用resolve完成,then将会执行,其接收了之前两次调用geocode的返回结果。结果之后被传入getRoute,此方法也返回一个promise。最终,当getRoute的promise解决后,doSomethingCoolWithDirections回调就执行了。 事件事件是另一种当异步回调完成处理后的通讯方式。一个对象可以成为发射器并派发事件,而另外的对象则监听这些事件。这种类型的事件处理方式称之为 观察者模式 。 backbone.js 库在withBackbone.Events中就创建了这样的功能模块。

还有其他用于发射事件的混合例子和函数库,例如 jQuery Event Emitter , EventEmitter , monologue.js ,以及node.js内建的 EventEmitter 模块。

事件循环是一个回调函数的队列。

一个类似的派发消息的方式称为 中介者模式 , postal.js 库中用的即是这种方式。在中介者模式,有一个用于所有对象监听和派发事件的中间人。在这种模式下,一个对象不与另外的对象产生直接联系,从而使得对象间都互相分离。

绝不要返回promise到一个公用的API。这不仅关系到了API用户对promises的使用,也使得重构更加困难。不过,内部用途的promises和外部接口的事件的结合,却可以让应用更低耦合且便于测试。

在先前的例子里面,doSomethingCoolWithDirections回调函数在两个geocode函数完成后执行。然后,doSomethingCoolWithDirections才会获得从getRoute接收到的响应,再将其作为消息发送出去。

这允许了应用的其他部分不需要直接引用产生请求的对象,就可以响应异步回调。而在取得命令时,很可能页面的好多区域都需要更新。在一个典型的jQuery Ajax过程中,当接收到的命令变化时,要顺利的回调可能就得做相应的调整了。这可能会使得代码难以维护,但通过使用消息,处理UI多个区域的更新就会简单得多了。

另外一些基于中介者模式传送消息的库有 amplify, PubSubJS, and radio.js。

结论

JavaScript 使得编写异步代码很容易. 使用 promises, 事件, 或者命名函数来避免“callback hell”. 为获取更多javascript异步编程信息,请点击Async JavaScript: Build More Responsive Apps with Less . 更多的实例托管在github上,地址NetTutsAsyncJS,赶快Clone吧 !

举例详解Python中smtplib模块处理电子邮件的使用 在基于互联网的应用中,程序经常需要自动地发送电子邮件。如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册;当用户忘记登陆密码

介绍一个简单的JavaScript类框架 在写work-in-progressJavaScriptbook一书时,对于javascript继承体系,我花费了相当的时间,并在该过程中研究了各种不同的模拟经典类继承的方案。这些技术方

在浏览器中打开或关闭JavaScript的方法 所有现代浏览器都使用了JavaScript的内置支持。很多时候,你可能需要启用或手动禁用此支持。本教程将让您知道如何启用和禁用JavaScript支持,在您的浏

标签: 深入理解中国式现代化

本文链接地址:https://www.jiuchutong.com/biancheng/380462.html 转载请保留说明!

上一篇:举例详解JavaScript中Promise的使用(举例详解民法典第502条)

下一篇:举例详解Python中smtplib模块处理电子邮件的使用(python中deque)

  • 长期待摊费用一般指什么
  • 材料采购成本是主营业务成本吗
  • 代征增值税业务的账务处理
  • 公司零星支出没有发票收据怎么开
  • 单位购牙膏牙刷卫生纸怎么做账
  • 在银行开资信证明的流程
  • 应收票据背书支付
  • 应交税金在贷方怎么调
  • 桂林军工企业单位有哪些
  • 发票专用章能刻章吗
  • 差旅费未及时报销说明怎么写
  • 会计准则一般选择哪个
  • 科目余额表借方和贷方
  • 公司为员工承担房租
  • 股东与公司之间是什么关系
  • 会计做账中记账表怎么做
  • 过路费可以抵税吗
  • 盘亏的转销金额
  • 工程结算收入以前年度多结转收入怎么处理?
  • 生产车间工资计入什么费用科目
  • 等值货币什么意思
  • 工厂的绿化费进项税额
  • php中的预定义变量
  • PHP:oci_field_is_null()的用法_Oracle函数
  • 科技财政支出的意义
  • wordpress建网站详细教程
  • php毫秒转换时分秒
  • yolov5损失
  • php传值和传引用的区别
  • php错误和异常
  • ajax调用php接口
  • html零基础入门教程
  • 织梦添加文章如何修改高级参数
  • 年报和汇算清缴不一致怎么处理
  • php如何判断是移动还是pc
  • 年数总和法怎么算年折旧额
  • 一般纳税人涉及进项税额转出的有
  • 新成立的小公司财务怎么管理
  • 房地产小规模纳税人预缴税款如何填申报表
  • 利润分配未分配利润期末有余额吗
  • mysql配置文件my.ini如何配置
  • 教育培训行业人员
  • 有形动产经营性租赁光租业务是什么意思
  • 材料的采购成本包括
  • 小企业营业外支出的内容
  • 费用转销是什么意思
  • 退货开负数发票的情况该如何做会计处理?
  • 发票边上的孔有什么用
  • 固定资产专票可以不抵扣吗
  • 新建公司需要什么
  • 房产开发企业以什么为主
  • 营业收入的核算内容包括
  • MySQL利用命令行工具启动和关闭的命令是什么
  • CentOS6 32/64位安装Adobe Flash Player组件的方法
  • 电脑主板bios是什么意思
  • soffice.exe - soffice进程是什么意思 有什么用
  • 笔记本win7win10双系统怎么装
  • 怎么删除windows7
  • win8系统远程桌面在哪里
  • win8怎么打开ie浏览器
  • python挑战
  • js方法
  • 如何在手机上直接买彩票
  • 30岁亿万富婆
  • Node.js中的construct构造函数
  • 使用NGUI时遇到物理引擎错误
  • 常用服务器配置
  • ip地址编址方法
  • angularjs4
  • java的file类的常用操作
  • shell脚本 su
  • js中的三种弹出消息提醒的命令
  • 使用SQLite数据库保存和处理数据
  • 电子税务局税务数字证书登录
  • 遵从与尊从
  • 最多跑一次改革是谁提出来的
  • 请问各位专家金线吊乌龟有什么功效
  • 重庆国税电子税务局手机版
  • 税务变更表
  • 会计专业有必要读博士吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设