2013-01-10 22 views
0

我遇到了一个小问题,在Dojo 1.6中挂接和链接延迟ajax请求。代码看起来像Dojo 1.6延迟链接和挂接问题

login : function(data) {    
     var def = lang.hitch(this.authenticate, this.authenticate(data)); 
     console.log(def); // [I] 
     return def; 
    }, 

    authenticate : function(data) { 
     require([ "dojo/Deferred", "dojo/request/xhr", "dojo/_base/lang", 
       "dojox/encoding/digests/MD5" ], lang.hitch(this, function(Deferred, xhr, 
       lang, MD5) { 
      var data2send = lang.mixin(data, { 
       action : "authenticate", 
       password : "21232f297a57a5a743894a0e4a801fc3", 
       userId : data.username 
      }); 

      return xhr(this.handlerUrl, { 
       handleAs : "json", 
       method : "POST", 
       sync : false, 
       data : data2send 
      }); 
     })); 
    } 

其中login()被调用。 Imho,它应该返回一个Deferred对象,它在authenticate()中的ajax-request完成后解析。因此,[I]中的日志记录应该给我一个Deferred-promise,但是Firebug将返回值记录为function()。我希望任何人都可以帮忙。

在此先感谢!

编辑: 另一个问题是,为什么def成为对象,这是由lang.hitch的第一个参数给出的。例如。在上面的代码中给出了“function()”。当我将第一个参数改为“this”时,日志给我“this” - 对象(“Object {...}”)本身。我认为hitch的机制不会影响返回的值,但只会将范围限制到第二个参数(这是所谓的函数)。我错了吗?!

回答

0

代码最后看起来是这样的:

define([ "dojo/_base/lang", "dojo/_base/declare", "dojo/Deferred", 
    "dijit/_Widget" ], function(lang, declare, Deferred) { 
return declare("LoginController", null, { 
    handlerUrl : "sessionHandler.php", 
    constructor : function(kwArgs) { 
     lang.mixin(this, kwArgs); 
    }, 

    login : function(data) { 
     def = new Deferred(); 
     auth = this.authenticate(data); 
     auth.then(function(success) { 
      if (success.success == true) { 
       def.resolve(true); 
      } else { 
       def.resolve(false); 
      } 
     }, function(err) { 
      def.resolve(false); 
     }); 
     return def; 
    }, 

    authenticate : function(data) { 
     var def = new Deferred(); 
     require([ "dojo/request/xhr" ], lang.hitch(this, function(xhr) { 
      var data2send = lang.mixin(data, { 
       action : "authenticate", 
       userId : data.userId 
      }); 

      xhr(this.handlerUrl, { 
       handleAs : "json", 
       method : "POST", 
       sync : false, 
       data : data2send 
      }).then(function(data) { 
       def.resolve(data); 
      }, function(err) { 
       def.reject(err); 
      }); 

     })); 
     return def; 
    } 
}); 
}); 

我没有做到让周围的需要异步调用,而不设置在前面的推迟。因此,Deferred构造函数必须在define语句中初始加载,所以我不需要在我的函数中异步地要求它。