`
blueion
  • 浏览: 40313 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

DOJO的Deferred机制

阅读更多

(AJAX)程序的一系列异步调用过程中,由于回调发生时间的不确定性,会面临回调函数触发管理的问题。Twisted中有一个Deferred机制用来解决这个问题,这个机制同样也被DOJO框架所引入。

 

Deferred其实是一个对象,通常这个Deferred对象持有一系列的callBack和errBack函数组成。

 

以AJAX call为例,通过方法request向server发出请求,收到server的回调后,由callBack函数处理回调;如果回调出错则由errBack处理。

 

 

一般流程

 

一个典型的使用Deferred机制方法是在request方法发出请求(1)后立刻返回一个Deferred对象(2),这个对象持有Callback和Errback函数的引用(3)。当server的回调到达时,通过某种机制(例如匹配id,通常依据具体应用而设计)找到该Deferred对象,执行其中的Callback和Errback函数。

 

 

 

其实Deferred可以持有一组链式的Callback和Errback函数组,可以让回调处理按照链式顺序进行:

 


 

DOJO的实现

dojo.Deferred其实代码并不复杂,通过addBoth,addCallback,addErrback实现回调函数的注册,需要注意的是callback和errback总是成对被注册的,也就是说如果用addCallback单独添加一个Callback函数的话,那么默认的Errback就是null。这些“回调函数对”被添加到一个Array(chain)中,等到callback或者errback被触发时被按顺序调用。

 

dojo.Deferred还设计了嵌套Deferred对象调用,也就是在某一Callback函数下存在另一个Deferred对象,这第二个Deferred对象的执行依赖于第一个Deferred对象的执行。实际上,这使事情变得复杂了,如果没有处理好第二个Deferred(比如执行其中的Callback出错),会使第一个Deferred中的剩下的Callback不能被执行到(因为有时候Errback会是null),从而产生意想不到的bug。可以参考一个bug的例子

 

不仅仅在AJAX call可以使用Deferred,在任何需要异步处理的地方都可以使用这个机制,比如DOJO中有非常多的例子可以查看。由于采用了对象的概念,Deferred使管理复杂的异步回调的过程变得简单,也使程序结构变得清晰。

  • 大小: 27.6 KB
  • 大小: 24.2 KB
分享到:
评论

相关推荐

    dojo开发文档

    7. **dojo/Deferred和dojo/promise**:Dojo的异步处理机制基于`dojo/Deferred`,它是Promise/A+规范的实现,处理回调和链式调用,使得异步编程更加优雅。 8. **dojo/ xhr和dojo/io**:Dojo的`dojo/xhr`和`dojo/io`...

    dojo-0.3.1-ajax

    Dojo的AJAX方法提供了错误处理机制,可以通过设置错误回调来处理网络问题、服务器错误或其他异常情况。 6. **上传文件** 虽然基本的xhr方法不支持文件上传,但Dojo提供了一个`dojo.form`模块,可以处理表单数据并...

    Dojo API 1.9.chm 离线参考手册

    5. **dojo/Event**:Dojo提供了高级的事件处理机制,包括事件监听(dojo/on)、事件传播控制(dojo/event基类)和事件合成(dojo/aspect),使得事件处理更加灵活和强大。 6. **dojo/store** 和 **dijit/tree**: ...

    dojo相关的js

    Dojo的核心组件包括dojo.js,这是一个包含Dojo基础功能的主文件,如加载机制、DOM操作、事件处理等。在使用Dojo进行AJAX编程时,开发者通常会引入这个文件,然后利用Dojo的`dojo.xhr`模块来进行异步请求。例如,`...

    dojo 官方教程 中文翻译

    3. **dojo/on事件处理**:dojo/on是Dojo提供的事件处理机制,它比原生的addEventListener更强大,支持跨浏览器的事件监听和处理。 4. **dojo/request**:Dojo的请求模块用于处理AJAX和非同步数据请求,支持...

    dojo完整包

    10. **工具和辅助库**:`dojo/has`模块提供了条件编译功能,`dojo/ready`模块则在DOM加载完成后执行代码,`dojo/Deferred`处理异步操作的结果等。 这个压缩包中的“dojo”文件可能包含了Dojo的源码、样式文件、示例...

    AJAX的DOJO中文文档

    总结,DOJO为AJAX提供了强大而灵活的支持,它的xhr模块简化了AJAX请求的编写,同时通过Deferred对象和回调机制使得异步编程更加易于理解和管理。结合“实战Dojo工具包.pdf”,开发者可以更全面地学习和掌握DOJO在...

    dojo-0.4.0-ajax

    3. `dojo.Deferred`: 在AJAX请求中,`dojo.Deferred`对象用于管理异步操作的回调。它允许开发者注册多个回调函数,根据请求的状态(成功、失败、取消等)依次执行。 4. `dojo.data`: Dojo的这个模块提供了数据存储...

    DojoAPI V1.9文档及实例

    Dojo Toolkit是一个全面的JavaScript库,包含了丰富的组件、工具和功能,支持跨浏览器兼容性,提供模块化开发,以及强大的数据绑定和事件处理机制。 在"描述"中提到的Dojo-1.9api文档CHM文件,是一种Windows帮助...

    Dojo的资料

    5. **异步编程与Ajax**:涵盖dojo/xhr,dojo/Deferred,以及Promise的使用。 6. **事件处理**:介绍dojo/on和dojo/aspect,以及如何处理DOM事件和应用级事件。 7. **动画和效果**:讲解dojo/fx和dojo/NodeList-fx...

    基于AJAX的DOJO架构分析与应用.zip

    - **DOJO的异步编程模型**:通过dojo/Deferred和dojo/promise,DOJO支持链式调用和错误处理,适应AJAX的异步特性。 4. **DOJO架构分析** - **加载机制**:DOJO的加载策略包括动态加载、延迟加载等,以优化页面...

    dojo-phone-cat:Dojo 版本的 Angularjs PhoneCat 教程

    5. **服务**:在Dojo中,可以使用`dojo/Deferred`和`dojo/promise`来处理异步操作,而不再需要AngularJS的$http或$resource服务。 6. **模板**:AngularJS的HTML模板语法与Dojo的`dojox/mvc`或`dijit/_...

    arcgis_js_v32_api.zip

    5. 异步处理:使用dojo.Deferred和dojo.promise.all处理异步请求,确保代码执行顺序。 四、最佳实践与优化 1. 分级显示:对于大范围、高分辨率的数据,使用LOD(Level of Detail)技术优化加载速度。 2. 缓存策略...

    深入浅出ES6

    - Promise的实现参考了C++项目Xanadu、E语言、Python中的实现以及JavaScript框架Dojo中的Deferred对象。 3. **for-of循环**: - 类似于传统的`for`循环,但专门用于遍历可迭代对象。 - 受到C++、Java、C#等语言...

    javascript异步编程

    在处理异步回调时, Deferred对象是一个强大的工具,最初源自Python的Twisted框架,后来被引入JavaScript的Mochikit库,现在在Dojo和其他许多库中都有实现。Deferred对象能够管理多个回调函数,包括成功和失败的回调...

Global site tag (gtag.js) - Google Analytics