iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Javascript异步编程是怎样的
  • 616
分享到

Javascript异步编程是怎样的

2024-04-02 19:04:59 616人浏览 独家记忆
摘要

本篇文章给大家分享的是有关javascript异步编程是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。这可能是个比较深的话题。何谓异步?

本篇文章给大家分享的是有关javascript异步编程是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

这可能是个比较深的话题。何谓异步?

笼统地说,异步在javascript就是延时执行。严格来说,javascript中的异步编程能力都是由BOM与DOM提供的,如setTimeout,XMLHttpRequest,还有DOM的事件机制,还有HTML5新增加的WEBwork, postMessage,等等很多。这些东西都有一个共同的特点,就是拥有一个回调函数,实现控制反转。由于控制反转是更深奥的问题,这里不想展开。不过有点可以确认的,回调函数的存在打断了原来的执行流程,让它们自行在适当的时机出现并执行,这是个非常便捷的模式。对比主动式的轮询,你就知它多么节能。在同步编程,代码基本上自上向下执行,在异步编程,一些代码就要写到回调函数中,如果代码之间存在依赖,回调函数套回调函数的情况也不少见,这种套嵌结构对以后的维护来说简直是地狱。还有一种我们不得不面对的情况,try...catch无法捕捉几毫秒之后发生的异常。另外,除了setTimeout外,异步编程基本上由事件机制承担的,它们的回调函数什么时候发生基本上都是未知数,可能由于后台发生系统级错误,无法再发出响应,或者,系统忙碌,一时半刻响应不过来,这两种情况我们也必需提供一个策略,中断这操作,也就是所谓的abort,这些都是异步编程的所要处理的课题。

$.post("/foo.JSON", function (dataOfFoo) {//多层套嵌结构的ajax回调   $.post("/bar.json", function (dataOfBar) {     $.post("/baz.json", function (dataOfBaz) {       alert([dataOfFoo, dataOfBar, dataOfBaz]);     });   }); });  function throwError(){   throw new Error('ERROR'); }  try{   setTimeout(throwError, 3000); } catch(e){   alert(e);//这里的异常无法捕获 }

由于在javascript编程,随时都碰到这样的需求,因此实现相关轻捷的api是重中之重。正如上面所说,它只少要有以下功能,能储存一组回调函数(domReary,多投事件,特效),在特定时刻中执行所有回调函数,如果发生错误能触发相应的处理函数(负向回调),能中止整个操作,从中断处再起操作,如果要求更多,我们还想能从串行转向并行,由并行转入串行。可能有许多概念大家听不懂,是不是?但想弄个好的特效,这些都是必需的。如果玩过后端JS的人,一定听说过node.js,现在基本成为它的代名词了。路由派发,IO操作,都是异步的,事件驱动的,为了实现优雅的异步编程,大牛们忙得焦头烂额,一个个方案被提出来,如do.js. step.js, async.js, flow.js……,不是太鸡肋,就是无法应用于前端。因此我们需要一个适合于前端的方案。

有件事我们必需明白,你想到的,人家都早已研究过了,并且已给出解决方案。十大javascript框架之一,Mochikit,就从python的Twisted库搞来Deferred,后来又给dojo学去,现在你们又看到,相同的东西又出现在Jquery1.5上了。不过,Mochikit的Deferred还有一个不为人知的分支,由日本大牛cho45搞出来(他同时也搞什么BigInt,跨浏览器Testing,名气紧随aMachang、uupaa、edvakf、nanto之后),叫JSDeferred。先说dojo那派系的(包括jQuery)的Deferred,一直处于无敌状态,与Common.js搞出一套规范,什么promises,then,when都是那时制定,jQuer基本全盘接受。另一分支,cho45的JSDeferred,构思非常奇特,没有使用数组来装载回调函数,而是通过setTimeout,image.onload, postMessage等异步机制巧妙地把维护列队地工作道回浏览器自身,虽然有致命缺陷,但其易用性也被日本JS界所首肯,我的Deferred对象就从它的基本上发展过来的。Deferred这东西,我通常称之为异步列队,因为它们的确是需要两组由回调函接构成的队列,非常之形象。

在我们搬出异步列队之前,让我们看看普通的列队是怎么实现延迟的。

var Queue = function(){         this.list = []       }       Queue.prototype = {         constructor:Queue,         queue:function(fn) {           this.list.push(fn)           return this;         },         dequeue:function(){          var fn = this.list.shift()||function(){};          fn.call(this)         } }

这样调用它:

var q = new Queue;       q.queue(function(){         log(1)       }).queue(function(){         log(2)       }).queue(function(){         log(3)       });       while(q.list.length){         q.dequeune(); }

但这是同步,想异步,我们需要用setTimeout:

var el = document.getElementById("test"); var q = new Queue(); q.queue(function(){   var self = this;   el.innerhtml = 1   setTimeout(function(){     self.dequeue()   },1000); }).queue(function(){   var self = this;   el.innerHTML = 2   setTimeout(function(){     self.dequeue()   },1000); }).queue(function(){   var self = this;   el.innerHTML = 3   setTimeout(function(){     self.dequeue()   },1000); }).dequeue()

如大家所见,这样写绝对不友好。我们需要把setTimeout整到Queue类中去,另对queue做一些修改,不要只弹出一个函数进行执行,通常情况下会对列队中的所有回调进行操作的,如domReay,多投事件。

var Queue = function(){   this.list = [] } Queue.prototype = {   constructor:Queue,   queue:function(fn) {     this.list.push(fn)     return this;   },   wait:function(ms){     this.list.push(ms)     return this;   },   dequeue:function(){     var self = this, list = self.list;     var el = list.shift()||function(){};     if(typeof el == "number"){       setTimeout(function(){         self.dequeue();       },el);     }else if(typeof el == "function") {       el.call(this)       if(list.length)         self.dequeue();     }   } }

Great,如果我们能自由控制每个回调的间隔,这对于做动画效果说,就变得非常简单了。但这Queue类相对我们最初定下的目标来说,还是差得远。Ajax,多投事件,domReay将统统划归于它的麾下,因此它需要用一些适用性更强的API。用过dojo的人也知,它的Deferred就像DNA的染色体一样,是双线的,可以捕捉不在同一时间线上的异常,而且这些列队不能像卫生筷那样用完一次就废了,这样就无法支撑多投事件的实现了。想要实现这些功能,就需要一个很复杂的东西,我将在第二部分隆重介绍我的异步列队,看它是如何优雅地解决这些问题。

以上就是Javascript异步编程是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网node.js频道。

--结束END--

本文标题: Javascript异步编程是怎样的

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

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

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

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

下载Word文档
猜你喜欢
  • Javascript异步编程是怎样的
    本篇文章给大家分享的是有关Javascript异步编程是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。这可能是个比较深的话题。何谓异步?...
    99+
    2024-04-02
  • JavaScript异步编程的用法
    这篇文章将为大家详细讲解有关JavaScript异步编程的用法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在一年前初学js的时候,看过很多关于异步编程的讲解。但是由于实...
    99+
    2024-04-02
  • JavaScript异步编程的使用
    这篇文章主要介绍“JavaScript异步编程的使用”,在日常操作中,相信很多人在JavaScript异步编程的使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaSc...
    99+
    2024-04-02
  • Javascript异步编程简介
    这篇文章主要介绍“Javascript异步编程简介”,在日常操作中,相信很多人在Javascript异步编程简介问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Javascri...
    99+
    2024-04-02
  • Laravel和JavaScript的异步编程与Python的异步编程有何不同?
    随着计算机技术的不断发展,异步编程已经成为了现代编程中的一个非常重要的概念。许多编程语言都提供了异步编程的支持,如Laravel、JavaScript和Python等。虽然它们都可以实现异步编程,但是它们之间的实现方式有所不同。本文将探讨...
    99+
    2023-09-08
    异步编程 laravel javascript
  • 异步的含义以及JavaScript异步编程的方法
    本篇内容主要讲解“异步的含义以及JavaScript异步编程的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“异步的含义以及JavaScript异步编程的方法...
    99+
    2024-04-02
  • JavaScript中异步编程的示例分析
    这篇文章给大家分享的是有关JavaScript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目的提升开发效率,编写易维护的代码引子问题请求时候为什么页面卡死??$.ajax({ &n...
    99+
    2023-06-15
  • JavaScript异步编程之Promise的初步使用详解
    1. 概述 Promise对象是ES6提出的的异步编程的规范。说到异步编程,就不得不说说同步和异步这两个概念。 从字面意思理解同步编程的话,似乎指的是两个任务同步运行,如果这样理解就...
    99+
    2024-04-02
  • javascript异步编程有哪些方式
    这篇文章主要为大家展示了“javascript异步编程有哪些方式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript异步编程有哪些方式”这篇文章吧...
    99+
    2024-04-02
  • Python 异步编程能否响应 javascript?
    随着Web应用程序的普及,JavaScript已经成为了前端开发的标配语言。而Python也因其易学易用而成为了数据科学、Web后端等领域的热门语言。在这两个语言的交汇点上,我们不禁要问一句:Python 异步编程能否响应 JavaScri...
    99+
    2023-07-27
    异步编程 响应 javascript
  • ASP异步编程框架教程:你是否知道异步编程的威力?
    在ASP.NET中,异步编程是很重要的一部分。它能够改善应用程序的性能,提高用户体验,同时还能够更好地利用服务器资源。本文将介绍ASP.NET中的异步编程框架,并演示一些实际的代码。 一、什么是异步编程? 在ASP.NET中,异步编程是指...
    99+
    2023-07-05
    异步编程 教程 框架
  • 异步编程:Python、Unix、JavaScript之间的差异和共同点是什么?
    异步编程是一种编程模型,它可以在程序执行其他任务的同时,处理多个并发的异步操作。Python、Unix和JavaScript都支持异步编程,但它们之间存在着差异和共同点。本文将探讨Python、Unix和JavaScript之间异步编程的差...
    99+
    2023-06-18
    unix javascript 异步编程
  • Javascript异步编程之你真的懂Promise吗
    目录前言基本用法语法错误处理Promise链式调用async & await常用的方法1、Promise.resolve()2、Promise.reject()3、Promi...
    99+
    2024-04-02
  • Python 异步编程是编程算法的未来吗?
    随着计算机技术的快速发展,人们对于编程算法也在不断地探索和研究。在传统的编程中,我们常常使用同步编程来实现程序的执行,但是在某些情况下,这种方式会导致程序的运行速度变慢,特别是在处理大量的数据时。为了解决这个问题,Python 提供了异步...
    99+
    2023-10-15
    异步编程 编程算法 分布式
  • JavaScript 开发者是否应该了解 Python 异步编程?
    JavaScript 和 Python 都是非常流行的编程语言,尤其是在 Web 开发领域。在现代 Web 应用程序中,异步编程已经成为了标配。在 JavaScript 中,我们通常使用 Promise、async/await 等异步处理技...
    99+
    2023-10-30
    异步编程 unix javascript
  • Java 异步编程:快速掌握异步编程的精髓!
    Java 是一种高度可扩展的编程语言,拥有大量的库和框架,使得开发人员能够快速构建复杂的应用程序。其中,异步编程是 Java 中非常重要的一种编程模型,可以帮助我们构建高效、高性能的应用程序。本文将介绍 Java 异步编程的基本概念,并演...
    99+
    2023-09-29
    异步编程 打包 load
  • JavaScript异步编程操作实现介绍
    目录异步编程同步模式与异步模式同步模式(Synchronous)异步模式(Asynchronous)回调函数PromisePromise基本用法Promise使用案例Promise常...
    99+
    2024-04-02
  • JavaScript异步编程中async函数详解
    目录async函数await 表达式async使用形式async读取文件async发送AJAX请求与生成器(Generator)相比async函数 async函数的返回值为 prom...
    99+
    2022-11-13
    JavaScript async JavaScript异步编程 JS async
  • JavaScript中实现异步编程模式的方法
    小编给大家分享一下JavaScript中实现异步编程模式的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript中实现异步编程模式的方法:1、回调函数,这是异步编程最基本的方法;2、事件监听;3、发布或订阅...
    99+
    2023-06-14
  • JavaScript AJAX 异步编程:打破传统的枷锁
    AJAX 的工作原理 AJAX 是一种客户端技术,允许 Web 应用程序与服务器进行异步通信,而无需重新加载整个页面。它通过在后台发送和接收数据来实现这一点,同时保持与用户的交互。 AJAX 的优点 响应迅速:AJAX 允许应用程序在不...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作