我遇到了处理异步调用的问题。
例如,我想用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
}
};
如你所见,这实在令人困惑。
是否还有其他设计模式可以处理异步调用?
答案 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
});
不完全是您的情景,但您明白了。组成异步原子变得相对容易。