6

我的应用程序上有一个通用模块,可以从远程服务器检索数据,并有get方法将检索到的数据导出到其他模块。

让我们假设这个模块的名称是MyData

define([], function(){

    return function(opts) {
        var data = null;

        // go get data with ajax
        var getData = function(){
            $.ajax("getData").done(function(response){
                data = response;
            });
        };

        getData();

        // return public api
        if (arguments.length !== 0) {
            var method = arguments[0];
            switch (method) {
                case "get": return data;
            }
        };

    };

});

问题是当我定义其他使用的模块时MyData,每次它都会创建一个新的实例MyData,导致它每次都从服务器检索数据。

我可以使用网络存储(或其他全局变量)来存储返回的数据,但这似乎是一个糟糕的解决方案。

有没有办法强制 RequireJS 只创建一次实例?

PS: 在我的项目中,我使用了 KnockoutJS,并且data变量是 ko.observable,所以也许 Knockout 对我的情况有解决方案?

4

1 回答 1

2

RequireJS 已经加载了每个模块一次。你只需要稍微重构你的代码:

// myModule.js
define(function() {
    // The dataFetch Promise will be initialized when this module
    // is loaded for the first time.
    var dataFetch = $.ajax("getData");

    return {
        getData: function () {
            // Return the Promise interface and let callers use the
            // .done, .fail etc. methods on it
            return dataFetch;
        }
    };
});

用法:

define([ "myModule" ], function (myModule) {
    myModule.getData().done(function (data) {
        // use the data
    });
});

通过使用返回的 Promise 接口$.ajax,您可以确保对仅获取一次的数据进行异步访问。

顺便说一句,您尝试实现的模式可能是模型。

于 2012-10-04T16:39:30.383 回答