2012-12-31 23 views
18

routeProvider如果我們給出一個包含promise的resolve對象,我們可以保存routing;它會等到所有的承諾解決。但是,我無法在應用程序的初始化中找到一種方法。保持一個服務的初始化,直到所有的promise都解決了

angular.module("app", []).run(function(){ //init app })但對於$resource$http這是異步,應用程序可以完成初始化的依賴關係(承諾)得到解決,將創建一個race condition之前。我們不希望這樣。

所以問題是,有沒有一種方法可以保持一個service的初始化,直到所有給定的promise都解決了?

+1

難道你不想[手動初始化](http://docs.angularjs.org/guide/bootstrap)? –

+1

設置一個回調到promise的手動初始化會有效,但是它並不優雅,angular有很好的DI,爲什麼我們不能從中受益?像*如果依賴是一個承諾,解決它之前進一步* –

+0

因爲你沒有包括你的應用程序的實際代碼,我不能告訴,但我認爲這個問題是覆蓋相同的問題:http://stackoverflow.com/questions/12265565/angularjs-promise-is-resolved-before-data-is-loaded?rq = 1 –

回答

5

我見過類似的問題。一個有點優雅的解決方案一個隊友使用的是與RequireJS組合,它的domready中模塊:

define(['require', 'angular', 'app','routes', 'pendingServices'], 
     function (require, ng, app, pendingServices) { 


    /* place operations that need to initialize prior to app start here 
    * using the `run` function on the top-level module 
    */ 
    app.run(pendingServices.init) 

    require(['domReady!'], function (document) { 
     /* everything is loaded...go! */ 
     ng.bootstrap(document, ['mainModule']); 
    }); 

}); 

在init方法中,你可以做所有的預加載(並等待所需的承諾)。我很有興趣聽到其他解決方案。

+0

爲什麼要用domReady? angular有自己的angular.element(document).ready()函數(這是jQueryLite的一個包裝)。 – asgoth

+0

domReady不是必需的,但RequireJS有點整潔,就這些。 – iwein

+0

但是這將如何工作? 'pendingServices'是一個使用$ timeout加載其內容的模塊嗎? – asgoth

1

只是想到這裏加載,但如何只聲明1'捕捉所有'的路線開始,並在該路線提供者,持有加載的路線,直到你已經做了你所需要的一切。 (使用決心和承諾)。

然後,當你完成後,註冊剩餘的路線,並重新加載原始路線。這一次,應該註冊一個更具體的處理程序,它將繞過你的「全部捕獲」初始化程序。

您認爲什麼問題?

+0

當然,你會得到所有的angulars DI – mcampster

相關問題