DOJO构造函数同步

时间:2015-02-18 10:08:14

标签: 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: 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"或""当",但我不知道如何应用它。

提前谢谢你, 纳乔。

1 个答案:

答案 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()函数。