Javascript DOJO构造函数同步
我在Javascript中同步DOJO构造函数时遇到了一个问题 我有一个需要实例化的“类”MYCLASS: MYCLASS.JSJavascript DOJO构造函数同步,javascript,dojo,synchronous,Javascript,Dojo,Synchronous,我在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
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没有填充外,它工作正常。
我读过关于“延期”或“何时”的书,但我不知道如何应用它
提前谢谢大家,,
Nacho.好吧,使用延迟并不能使其同步,但它可能会解决您的问题。延迟所做的很简单,它们提供了一个API来访问异步数据
例如,考虑下面的场景:
var myAsyncData=null;
// ...
//以下是一些异步代码(可能是REST调用)
setTimeout(函数(){
myAsyncData=3;
}, 1000);
// ...
log(myAsyncData);
这显然会记录null
,因为数据是异步填充的,并且在您记录的时候,请求还没有完成
为了解决这个问题,人们可以使用延期,例如:
var myDeferred=new Deferred();
var myAsyncData=myDeferred.promise;
// ...
//以下是一些异步代码(可能是REST调用)
setTimeout(函数(){
我的决定(3);
}, 1000);
// ...
myAsyncData.then(函数(myData){
console.log(myData);
});
这里发生的事情是,数据被包装在某种API中,它将实际打印3
这是因为在代码的
then()
部分中,您正在等待数据。但请记住then()
函数中的代码块本身也是异步的
回到您的案例。如果您使用的是
dojo/request/xhr
,那么您不必自己使用dojo/Deferred
,因为该模块已经在内部使用了Deferred
你应该写以下内容:
定义([
“dojo/_base/declare”,
“dojo/_base/lang”,
“dojo/request/xhr”
],函数(declare、lang、xhr){
返回declare(null{
var1:null,
var2:null,
var3:null,
构造函数:函数(选项){
this.var1=options.var1;
this.var2=options.var2;
这个;
},
_doSomething:function(){
//这里完成了“var3”。
//一些需要更多时间处理REST请求的代码。
this.var3=xhr(“rest/request”{
handleAs:“json”
});
}
});
});
然后在代码中,您应该使用:
var myInstance=newmyclass(选项);
myInstance.var3.then(函数(var3Data){
console.log(var3Data);//这包含实际值!
});
如果在收到REST服务的响应时需要进行一些额外的处理,则可以使用延迟,例如:
\u doSomething:function(){
//这里完成了“var3”。
//一些需要更多时间处理REST请求的代码。
var dfd=新的延迟();
this.var3=dfd.promise;
xhr(“休息/请求”{
handleAs:“json”
}).then(函数(myData){
解析(myData.someProperty);
});
}
但是请记住,使用延迟通常涉及三个步骤。首先,您必须创建延迟,然后必须解析它,要侦听解析的数据,您应该使用
then()
函数。非常感谢。这是一个很好的解决方案,但最后我使用事件解决了问题。是的,这取决于用例。异步通信可以通过延迟/承诺、回调或发布/订阅来处理。