Javascript Dojo 1.6延迟链接和挂接问题
我在Dojo1.6中遇到了一个小问题,即挂接和链接延迟的ajax请求。代码看起来像Javascript Dojo 1.6延迟链接和挂接问题,javascript,dojo,chaining,deferred,Javascript,Dojo,Chaining,Deferred,我在Dojo1.6中遇到了一个小问题,即挂接和链接延迟的ajax请求。代码看起来像 login : function(data) { var def = lang.hitch(this.authenticate, this.authenticate(data)); console.log(def); // [I] return def; }, authenticate : function(data
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()的位置。首先,它应该返回一个延迟对象,该对象在authenticate()中的ajax请求完成后解析。因此,登录[I]应该给我一个延迟承诺,但Firebug将返回值记录为function()。我希望任何人都能帮忙
提前谢谢
编辑:
另一个问题是,为什么def成为对象,这是由lang.hitch的第一个参数给出的。例如,在上面的代码中,日志给了我“function()”。当我将第一个参数更改为“this”时,日志会给出“this”-对象(“object{…}”)本身。我假设hitch机制不影响返回值,只将作用域挂接到第二个参数(即被调用的函数)中。我错了吗 代码最终如下所示:
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;
}
});
});
如果不在前面设置延迟,我无法绕过require的异步调用。因此,延迟构造函数最初必须在define语句中加载,因此我不需要在函数中异步地要求它