我有一个问题需要在Javascript中同步DOJO构造函数。
我有一个"班级" MYCLASS我需要实例化:
MYCLASS.JS
define([
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/when',
'dojo/Deferred',
], function(declare, lang, when, Deferred){
return declare(null, {
var1: null,
var2: null,
var3: [],
constructor: function(options){
this.var1 = options.var1;
this.var2 = options.var2;
this._doSomething();
},
_doSomething: function(){
//Here the "var3" is completed.
//Some code which needs more time with REST requests.
}
});
});
好的,那我需要在我的控制器中得到一个这样的实例:
var myInstance = new MYCLASS(options);
除了没有填充的var3之外,它工作正常。 我读过关于" Deferred"或""当",但我不知道如何应用它。
提前谢谢你, 纳乔。
答案 0 :(得分:0)
好吧,使用deferreds并不能使它同步,但它可以解决你的问题。延迟做的很简单,它们提供了一个API来访问异步数据。
例如,请考虑以下情形:
var myAsyncData = null;
// ...
// The following is some asynchronous code (could be a REST call)
setTimeout(function() {
myAsyncData = 3;
}, 1000);
// ...
console.log(myAsyncData);
这显然会记录null
,因为数据是异步填充的,当您正在记录时,请求尚未完成。
要解决这个问题,人们可以使用延迟,例如:
var myDeferred = new Deferred();
var myAsyncData = myDeferred.promise;
// ...
// The following is some asynchronous code (could be a REST call)
setTimeout(function() {
myDeferred.resolve(3);
}, 1000);
// ...
myAsyncData.then(function(myData) {
console.log(myData);
});
这里发生的是数据包含在某种API中,它实际上会打印3
。
这是有效的,因为在代码的then()
部分,您正在等待数据。但请记住,then()
函数中的代码块本身也是异步的!
回到你的案子。如果您正在使用dojo/request/xhr
,那么您不必自己使用dojo/Deferred
,因为该模块已在内部使用延迟。
您应该写的内容如下:
define([
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/request/xhr'
], function(declare, lang, xhr){
return declare(null, {
var1: null,
var2: null,
var3: null,
constructor: function(options){
this.var1 = options.var1;
this.var2 = options.var2;
this._doSomething();
},
_doSomething: function() {
//Here the "var3" is completed.
//Some code which needs more time with REST requests.
this.var3 = xhr("rest/request", {
handleAs: "json"
});
}
});
});
然后在代码中使用:
var myInstance = new MYCLASS(options);
myInstance.var3.then(function(var3Data) {
console.log(var3Data); // This contains the actual value!
});
如果您在获得REST服务的响应时需要进行一些额外的处理,那么您可以使用延迟,例如:
_doSomething: function() {
//Here the "var3" is completed.
//Some code which needs more time with REST requests.
var dfd = new Deferred();
this.var3 = dfd.promise;
xhr("rest/request", {
handleAs: "json"
}).then(function(myData) {
dfd.resolve(myData.someProperty);
});
}
但请记住,使用延迟总是涉及三个步骤。首先,您必须创建延迟,然后您必须解决它,并且要收听已解析的数据,您应该使用then()
函数。