Javascript DOJO构造函数同步

Javascript 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

我在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没有填充外,它工作正常。 我读过关于“延期”或“何时”的书,但我不知道如何应用它

提前谢谢大家,,
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()
函数。

非常感谢。这是一个很好的解决方案,但最后我使用事件解决了问题。是的,这取决于用例。异步通信可以通过延迟/承诺、回调或发布/订阅来处理。