我有一个需要执行一些引导/启动的应用程序,例如:
- 阿贾克斯
- 动态需求
- 路由,设置其他东西
在能够运行之前。
我现在很难将这些任务组织在一起。尤其是异步行为让我头疼。目前我正在使用事件来共享获取的结果并观察应用程序的状态。不幸的是,这导致了酿酒学上的不便。然后我尝试使用一些承诺库,如 q、jquery.defered,但它们并不真正符合我的问题。
这是代码的简化版本:
// this could be an ajax call fetching some user data
var fetchUser = function() {
var user = {};
// lets emulate the ajax call with setTimeout
setTimeout(function() {
// set some values
user.username = 'bodo';
user.password = 'helloKitty';
// return the user object we "fetched"
return user;
}, 300);
};
// this could fetch some config or some requirejs modules
var fetchConfig = function() {
var config = {};
// we emulate this too...
setTimeout(function() {
return config;
}, 200);
};
// this could be anything else like setting up some objects
var justSetUpSomething = function() {
var someObj = {};
someObj.router = 'this could be a router object for example';
someObj.logger = 'or a logger';
return someObj;
};
// in the final step everything should be merged together
// and be passed as event argument
var finalStep = function(user, config, someObj) {
var mainObj = {};
mainObj.user = user;
mainObj.config = config;
mainObj.someObj = someObj;
// trigger some event system
trigger('everything:ready', mainObj);
};
也可以在以下位置查看:http: //jsfiddle.net/uzJrs/3/
我希望这能描述我的问题:
有三个完全不同的异步任务。当他们都准备好时,他们的结果必须合并并以某种方式传递给另一个对象。
事件使这可行,但远不能理解,承诺也不能真正让我开心。难道没有另一种有用的设计模式吗?