`
子衿青青
  • 浏览: 110452 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

dojo 1.6 官方教程:dojo.Deferred 初探

 
阅读更多

作者: Bryan Forbes

译者: feijia (tiimfei@gmail.com)

原文连接: http://dojotoolkit.org/documentation/tutorials/1.6/deferreds/

适用dojo 版本: 1.6

难度: 中等

在本教程中, 你将学到使用Dojo的 defer(延迟) 方法的基本知识。

使用延迟方法,可以优雅轻松的处理在JS编程中常见的异步调用。我们还将解释如何使用DeferredList,它能够一次处理多个延迟的异步调用。

入门

初听起来, “延迟" (Deferred) 这个名字颇为神秘。但它其实是一个Dojo提供给我们用来处理异步调用(例如Ajax)的强大工具. 简单来说,一个Deferred对象它会等待一段时间再去执行指定的调用,直到某个特定的事件发生或者前一个动作完成。Ajax就是一种常见的例子: 发出一个Ajax请求之后,我们需要等待服务器把响应返回之后才会调用处理函数。所以Deferred对象提供给我们的就是这种将某个动作延迟并等待某个事件发生的能力。在本教程中,我们将会结合Ajax教程的内容一起来解读如何使用Deferred对象更好的管理异步的JS程序。

dojo.Deferred

延迟的概念并非Dojo专有,(译者:Jquery 等其他JS框架也有类似的对象和实现, CommonJS 组织还为此定义了一套标准 ), 从0.3 版本开始Dojo就实现了dojo.Deferred对象。

Deferred对象有三个状态,初始化时是"unresolve” 状态,当它所等待的事件发生时, 进入"resolve" 状态, 第三种状态是出错状态,即该事件没有按照预期的发展,例如服务器端返回了错误消息,也称reject 状态.

创建Deferred对象后,我们可以通过调用该对象的then方法注册一个回调函数,表示当这个Deferred对象等待的某个事件发生时(resolve),就调用该回调函数。then 方法还接受第二个参数,可以制定当事件失败或出错时(reject)时调用的出错回调函数 .

让我们来看一个例子:

查看示例

在上面的示例中,我们创建了一个dojo.Deferred 对象并在上面分别注册了一个成功回调函数和出错回调函数。我们还调用了dojo.xhrGet 一个异步Ajax调用,去服务器端获取"user.json"。 如果这个ajax调用成功了,我们在xhr对象的load属性所设的回调函数中会将dojo.Deferred对象置为resolve状态 ,这时我们在该Deferred对象上注册的回调函数将会被调用;如果ajax调用失败,则Deferred上注册的错误回调函数将会被调用。

上面的例子,你可能会觉得是多此一举, 为什么不直接在xhrGet里直接分别设定成功和失败的回调函数呢? 是的,你的确可以这么做,但是通过引入Deffered对象,我们把负责处理服务器端返回数据的逻辑(回调函数)和发送Ajax请求的逻辑进行了解藕。

实际上,为了方便开发者使用Deffered对象,Dojo的Ajax构造函数方法会直接返回给你一个Deferred对象,因此上面的代码可以简化不少:

查看示例

在这个例子中我们不再需要设置dojo.xhrGet的 load属性了,可以直接在xhrGet返回的Deferred对象上通过then来注册回调函数. 代码逻辑更加直观简洁.

在回调函数中,我们遍历了从服务器端返回的用户列表,并且为每个用户创建了一个HTML列表 。 从功能上看,和前一个例子完全一样,但是在这个例子中,我们得以把处理服务器端数据的逻辑和发送Ajax请求的逻辑分开了。 所以Deferred对象的一个重要功能就是对我们的程序逻辑进行解藕。 (decoupling)

链式调用

dojo.Deferred是个挺容易理解的概念,但是它还有一些很强大的功能值得我们继续探索. 其中之一就是链式调用(Chaining):每个then方法的返回值都仍然是一个Defered对象。 我们来看一个例子:

假设前面的例子里服务器端返回的不是JSON格式的用户对象,而是每个用户的信息的原始值。 值当然不如对象方便使用,所以我们希望注册一个回调函数来把这些原始数值转换为用户对象。

注意: 严格来说then方法的返回值并不是一个Deferred对象,它有个特定的名字"promise", 即承诺,实现了一个特定的API. 你可以进一步阅读关于prommise的教程 来深入学习, 不过在这里,我们可以暂时理解为 一个promise对象提供了和Deferred对象完全相同的then方法。因此Deferred对象和Promise对象的then方法可以进行连续的链式调用。这样做的好处是什么呢?链式调用时,原始的Defered对象不会被修改,而且服务器端的返回的数据也没有被修改,你可以继续在original的defered对象上注册其他的回调函数来对原始数据进行进一步操作,在前面的例子基础上,你可以注册一个新的回调到original上,例如:

查看示例

我们进一步可以把上面的例子改成:

通过这样封装, 使用getUserList的方法就总是能获取到一个已经处理好的用户列表了。 (实验: 反复调用会导致多次ajax调用么?)

dojo.DeferredList

有时,我们需要同时从多个不同的来源获取数据,当这些数据全部到位后我们希望可以被通知到。Dojo也提供了方便的封装来辅助你完成这一工作,这就是dojo.DeferredList对象。

使用dojo.DeferredList时, 只要把一组Deferred对象(作为数组)传入它的构造函数,它会返回给你一个新的Deferred对象。 在此对象上,你可以注册一个回调函数,当该回调函数被调用时,原始的deferred对象的结果会作为参数被传递进入该回调函数。参数是一个tuple数组,(tuple就是一个二元数值对)。数值对中第一个数值是一个boolean表示该Deferred是成功还是失败,第二个数值是该Deferred的返回值。 让我们看一个例子:

这个例子中我们想从服务器端分别获取用户信息和用户的状态。 我们使用了一个DeferrredList来等待这两个请求都完成后进行处理,回调函数先检查两个请求是否都成功完成了,如果没有发生任何错误,则遍历两个请求分别获得的用户数据和状态数据。 回调函数只有当两个请求都进入完成状态后才会被调用,因此我们不用关心究竟是哪个请求先完成了。

(设想一下,如果没有DeferredList,你需要如何手动处理这个情形?)

查看示例

结论

绝大多数JavaScript应用都需要使用Ajax,因此它们都需要注册异步的回调函数。dojo.Deferred就提供了这样一个简单又优雅的方法。 它可以非常灵活的进行链式调用;而使用dojo.DeferredList又可以让你处理个Deferred对象。

分享到:
评论

相关推荐

    dojo v1.6 官方最新版同步下载.zip

    标题中的"dojo v1.6 官方最新版同步下载.zip"指的是Dojo框架的1.6版本,这是一个官方发布的更新版本,可能包含了性能优化、新特性、修复的bug以及对之前版本的改进。 Dojo 1.6 版本主要知识点包括: 1. **模块系统...

    dojo1.6关于DOM相关操作的官方介绍

    2. **dojo.NodeList**: dojo.query返回的是一个dojo.NodeList对象,它扩展了Array原型,提供了许多便利的方法,如`forEach`、`filter`、`map`等,使得遍历和操作DOM节点变得更加简单。此外,NodeList还支持样式操作...

    Requirejs异步加载Dojo1.6

    本文将深入探讨如何使用Requirejs实现对Dojo 1.6版本的异步加载,并在Tomcat 6服务器环境下运行。 ### Requirejs:模块加载器 Requirejs是由James Burke创建的一个JavaScript库,它的主要功能是解决JavaScript的...

    dojo-release-1.6.1-src.zip

    2. **AMD 模块系统**: AMD是Dojo 1.6引入的重要特性,它允许异步加载JavaScript模块,解决了大型应用中因脚本顺序依赖导致的性能问题。require.js是基于AMD实现的一个知名库,而Dojo 1.6是最早采用这一模式的库之一...

    dojo 1.6 api

    dojo 1.6 api包含dojo、dojox、dijit等3个部分的api。

    dojo学习...........

    2. 引入Dojo核心库:通过`<script>`标签引入`dojo.js`,这是Dojo的基础文件,可能已经包含了部分常用模块。 3. 声明需要使用的模块:使用`dojo.require()`来引入所需的包或模块,确保它们在运行时可用。 Dojo为了...

    dojo精品中文教程(全)

    Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...

    dojo1.6官网

    9. **dojo.query**:类似jQuery的选择器,使开发者能够方便地选取DOM元素。 10. **dojo/on**:事件处理模块,提供了一种更灵活、高性能的方式来处理DOM事件。 在"dojo-release-1.6.1"这个压缩包中,你可以找到Dojo...

    dojo-release-1.4.2-src.tar.gz

    1. **dojo目录**:这是Dojo的核心库,包含了各种模块、组件和工具,如dojo.js,提供核心功能如事件处理、Ajax通信、DOM操作等。 2. **dijit目录**:这是一个UI组件库,包含各种可复用的界面元素,如按钮、表单、...

    dojo精品中文教程(包一)

    Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...

    dojo精品中文教程(包二)

    Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...

    dojo-release-1.0.3-src.zip

    开发者可以通过dojo.require()引入需要的模块,如dojo.dom、dojo.event等,这在当时的JavaScript环境中是一个创新的解决方案,提高了代码的组织性和可维护性。 3. **Dojo的核心组件** - **dojo.js**:Dojo的核心...

    dojo-release-1.1.1.tar.gz

    Dojo 是一个强大的JavaScript 库和工具集,用于构建富互联网应用程序(Rich Internet Applications, RIA)。这个"dojo-release-1.1.1.tar.gz"文件是Dojo库的一个特定版本,即1.1.1版,以tar.gz格式打包。这种格式是...

    dojo精品中文教程(包三)

    Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...

    struts2-dojo-plugin-2.3.15.3.jar.zip

    Struts2 Dojo Plugin是Apache Struts框架的一个扩展,它为开发者提供了丰富的AJAX功能,以便在基于Struts2的应用程序中实现动态、交互式的用户界面。这个版本号"2.3.15.3"表明这是一个较旧的版本,但仍然在许多现有...

    dojo-release-1.12.2-src.zip

    《Dojo Toolkit 1.12.2 源代码详解》 Dojo Toolkit,简称Dojo,是一款功能强大的JavaScript库,专为构建富互联网应用(RIA)而设计。这个开源项目提供了完整的前端开发框架,包括UI组件、数据管理、动画效果以及...

    Dojo.The.Definitive.Guide.pdf.rar

    解压密码在:http://www.pin5i.com/showtopic-dojo-the-definitive-guide.html

    Python库 | dojo-cli-0.1.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:dojo-cli-0.1.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    struts2-dojo-plugin-2.3.1.2.jar

    struts2-dojo-plugin-2.3.1.2.jar

    Dojo 入门 + Dojo 工具包系列 + Dojo 使用技巧 ......

    在使用Dojo进行Ajax通信时,Dojo的`dojo.xhr`模块提供了与服务器端进行异步数据交换的接口。它可以处理各种HTTP请求类型,如GET、POST、PUT和DELETE,支持JSON、XML等多种数据格式,为开发者提供了统一的API。 Dojo...

Global site tag (gtag.js) - Google Analytics