将异步调用转换为同步?

时间:2012-09-16 14:15:40

标签: javascript design-patterns asynchronous publish-subscribe

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

例如,我想用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
    }

};

如你所见,这实在令人困惑。

是否还有其他设计模式可以处理异步调用?

1 个答案:

答案 0 :(得分:3)

查看jQuery Deferred object。 (即使没有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
});

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