dojo.Deferred

我觉得我用这个方法就是为了,让两个普通的js函数有顺序的执行(同步),而不是异步的去触发。

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

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

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

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

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

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

 
 
  1. vardef=newdojo.Deferred(),
  2. userlist=dojo.byId("userlist");
  3. def.then(function(res){
  4. //Thiswillbecalledwhenthedeferred
  5. //isresolved
  6. dojo.forEach(res,function(user){
  7. dojo.create("li",{
  8. id:user.id,
  9. innerHTML:user.username+":"+user.name
  10. },userlist);
  11. });
  12. },function(err){
  13. //Thiswillbecalledwhenthedeferred
  14. //isrejected
  15. dojo.create("li",{
  16. innerHTML:"Error:"+err
  17. },userlist);
  18. });
  19. dojo.xhrGet({
  20. url:"users.json",
  21. handleAs:"json",
  22. load:function(res){
  23. //Resolvewhencontentisreceived
  24. def.resolve(res);
  25. },
  26. error:function(err){
  27. //Rejectonerror
  28. def.reject(err);
  29. }
  30. });

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

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

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

 
 
  1. vardef=dojo.xhrGet({
  2. url:"users.json",
  3. handleAs:"json"
  4. });
  5. def.then(function(res){
  6. varuserlist=dojo.byId("userlist");
  7. dojo.forEach(res,function(err){
  8. //Thisshouldn'toccur,butit'sdefinedjustincase
  9. alert("Anerroroccurred:"+err);
  10. });

参考网址:http://www.jb51.cc/article/p-urluhjim-zq.html

官网: http://dojotoolkit.org/reference-guide/dojo/Deferred.html

相关文章

我有一个网格,可以根据更大的树结构编辑小块数据.为了更容易...
我即将开始开发一款教育性的视频游戏.我已经决定以一种我可以...
我正在使用带有Grails2.3.9的Dojo1.9.DojoNumberTextBox小部...
1.引言鉴于个人需求的转变,本系列将记录自学arcgisapiforja...
我正在阅读使用dojo’sdeclare进行类创建的语法.描述令人困惑...
我的团队由更多的java人员和JavaScript经验丰富组成.我知道这...