如何使用RequireJS仅加载和运行模块一次

时间:2012-10-04 16:28:06

标签: javascript knockout.js requirejs

我的应用程序上有一个通用模块,用于从远程服务器检索数据,并使用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只创建一次实例?

P.S: 在我的项目中,我使用KnockoutJS,而data变量是ko.observable,所以也许淘汰赛可以解决我的情况?

1 个答案:

答案 0 :(得分: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
    });
});

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

顺便说一句,也许您尝试实施的模式是模型。