知识大全 JavaScript异步编程的4种方法

Posted 函数

篇首语:一名具有高尚师德的教师,须是一个因材施教,公正公平对待每一名学生的教师。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JavaScript异步编程的4种方法相关的知识,希望对你有一定的参考价值。

JavaScript异步编程的4种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  你可能知道 Javascript语言的执行环境是 单线程 (single thread)

  所谓 单线程 就是指一次只能完成一件任务 如果有多个任务 就必须排队 前面一个任务完成 再执行后面一个任务 以此类推

  

  这种模式的好处是实现起来比较简单 执行环境相对单纯 坏处是只要有一个任务耗时很长 后面的任务都必须排队等著 会拖延整个程序的执行 常见的浏览器无响应(假死) 往往就是因为某一段Javascript代码长时间运行(比如死循环) 导致整个页面卡在这个地方 其他任务无法执行

  为了解决这个问题 Javascript语言将任务的执行模式分成两种 同步(Synchronous)和异步(Asynchronous)

   同步模式 就是上一段的模式 后一个任务等待前一个任务结束 然后再执行 程序的执行顺序与任务的排列顺序是一致的 同步的 异步模式 则完全不同 每一个任务有一个或多个回调函数(callback) 前一个任务结束后 不是执行后一个任务 而是执行回调函数 后一个任务则是不等前一个任务结束就执行 所以程序的执行顺序与任务的排列顺序是不一致的 异步的

  

   异步模式 非常重要 在浏览器端 耗时很长的操作都应该异步执行 避免浏览器失去响应 最好的例子就是Ajax操作 在服务器端 异步模式 甚至是唯一的模式 因为执行环境是单线程的 如果允许同步执行所有请求 服务器性能会急剧下降 很快就会失去响应

  本文总结了 异步模式 编程的 种方法 理解它们可以让你写出结构更合理 性能更出色 维护更方便的Javascript程序

  一 回调函数

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

  假定有两个函数f 和f 后者等待前者的执行结果

  f ()

  f ()

  如果f 是一个很耗时的任务 可以考虑改写f 把f 写成f 的回调函数

  function f (callback)

  setTimeout(function ()

  // f 的任务代码  callback()

   )

  

  执行代码就变成下面这样

  f (f )

  采用这种方式 我们把同步操作变成了异步操作 f 不会堵塞程序运行 相当于先执行程序的主要逻辑 将耗时的操作推迟执行

  回调函数的优点是简单 容易理解和部署 缺点是不利于代码的阅读和维护 各个部分之间高度耦合(Coupling) 流程会很混乱 而且每个任务只能指定一个回调函数

  二 事件监听

  另一种思路是采用事件驱动模式 任务的执行不取决于代码的顺序 而取决于某个事件是否发生

  还是以f 和f 为例 首先 为f 绑定一个事件(这里采用的jQuery的写法)

  f on( done f )

  上面这行代码的意思是 当f 发生done事件 就执行f 然后 对f 进行改写

  function f ()  setTimeout(function ()   // f 的任务代码  f trigger( done )

   )

  

  f trigger( done )表示 执行完成后 立即触发done事件 从而开始执行f

  这种方法的优点是比较容易理解 可以绑定多个事件 每个事件可以指定多个回调函数 而且可以 去耦合 (Decoupling) 有利于实现模块化 缺点是整个程序都要变成事件驱动型 运行流程会变得很不清晰

  三 发布/订阅

  上一节的 事件 完全可以理解成 信号

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

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

  首先 f 向 信号中心 jQuery订阅 done 信号

  jQuery subscribe( done f )

  然后 f 进行如下改写

  function f ()  setTimeout(function ()   // f 的任务代码  jQuery publish( done )

   )

  

  jQuery publish( done )的意思是 f 执行完成后 向 信号中心 jQuery发布 done 信号 从而引发f 的执行

  此外 f 完成执行后 也可以取消订阅(unsubscribe)

  jQuery unsubscribe( done f )

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

  四 Promises对象

  Promises对象是CommonJS工作组提出的一种规范 目的是为异步编程提供统一接口

  简单说 它的思想是 每一个异步任务返回一个Promise对象 该对象有一个then方法 允许指定回调函数 比如 f 的回调函数f 可以写成

  f () then(f )

  f 要进行如下改写(这里使用的是jQuery的实现)

  function f ()  var dfd = $ Deferred()

  setTimeout(function ()   // f 的任务代码  dfd resolve()

   )

  return dfd promise;

  

  这样写的优点在于 回调函数变成了链式写法 程序的流程可以看得很清楚 而且有一整套的配套方法 可以实现许多强大的功能

  比如 指定多个回调函数

  f () then(f ) then(f )

  再比如 指定发生错误时的回调函数

  f () then(f ) fail(f )

cha138/Article/program/Java/JSP/201311/19586

相关参考

知识大全 JavaScript对象化编程基本对象分析[4]

JavaScript对象化编程基本对象分析[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 C#异步编程模式IAsyncResult概述

C#异步编程模式IAsyncResult概述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  IA

知识大全 Java中的异步网络编程

Java中的异步网络编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文对编写客户服务器应用

知识大全 编程高手 DotNet异步消息处理方法

编程高手DotNet异步消息处理方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!如果想检索消息但

知识大全 Javascript面向对象编程

Javascript面向对象编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Javascri

知识大全 JavaScript模块编程之写法

JavaScript模块编程之写法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随着网站逐渐变

知识大全 如何快速掌握JavaScript面向对象编程

如何快速掌握JavaScript面向对象编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    

知识大全 JavaScript对象化编程基本对象分析[3]

JavaScript对象化编程基本对象分析[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 JavaScript对象化编程基本对象分析[2]

JavaScript对象化编程基本对象分析[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 JavaScript对象化编程基本对象分析[1]

JavaScript对象化编程基本对象分析[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!