0

我在处理异步调用时遇到了问题。

例如,我想用 requirejs 动态加载一些模块。目前我使用订阅者-发布者模式。不幸的是,这使我的代码在某些情况下真的很混乱......:

想象对象中有一个有效的事件系统

var loader = {
    load: function(modules) {
        // do a async requirejs call
        require(modules, function(){
            // map arguments to normal array
            var modules = [].slice().call(arguments);
            // fire loaded event, pass modules
            this.trigger('loaded', modules);
        }.bind(this));
    }
};


var parent = {
    // do some initialization work
    initialize: function() {
        // execute the second initialization when our modules have finished loading async
        loader.on('loaded', this.secondInitialize, this);
        // require the given modules in the array
        loader.load(['one', 'two', 'three']);
    },

    secondInitialize: function(modules) {
        var three = new modules[2]();
        // do something with the 'three' module
    }

};

如您所见,这确实令人困惑。

是否有任何其他设计模式可以很好地处理异步调用?

4

1 回答 1

3

查看jQuery Deferred 对象。(即使没有 jq,大多数库都有 javascript 承诺的实现)

有了它,您可以执行以下操作:

var loadingOne = getLibOne(); //returns a jquery deferred promise
var loadingTwo = getLibTwo(); //returns another one

var loadingAllLibraries = $.when(loadingOne, loadingTwo);
loadingAllLibraries.done(function(lib1, lib2) {
  //... stuff
});

不完全是你的场景,但你明白了。组成异步原子变得相对容易。

于 2012-09-16T14:22:08.603 回答