我這就需要執行一些開機/啓動喜歡的應用程序:如何處理這些異步函數(?設計模式)
- AJAX
- 動態requirejs
- 路由,建立了別的東西
之前能夠運行。
我現在遇到困難一起組織這些任務。 特別是異步行爲讓我頭痛。 目前我正在使用事件來共享獲取的結果並觀察應用程序的狀態。不幸的是,這導致了生態,不方便的廢話。 然後我嘗試使用一些promise類庫,如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/
我希望這說明我的問題:
有三種完全不同的,異步任務。當他們都準備好時,他們的結果必須合併,並以某種方式傳遞給另一個對象。
事件使這可行但遠非可以理解和承諾的方式也不真正讓我開心。 沒有其他有用的設計模式嗎?
Deferreds真正做到這一點。 – Bergi
@Bergi我以爲他們只會幫助反對'厄運金字塔'?你也在建立一個對lib的依賴。但是你有沒有例子? – bodokaiser