2012-12-31 13 views
18

In routeProvider possiamo tenere lo routing se forniamo un oggetto di risoluzione che contiene promesse; aspetterebbe che tutte le promesse siano risolte. Tuttavia, non ho trovato il modo di farlo nell'inizializzazione dell'applicazione.In attesa di un'inizializzazione di un servizio fino a quando non vengono risolte tutte le promesse

C'è angular.module("app", []).run(function(){ //init app }) ma per un $resource o $http che è asincrona, l'applicazione può terminare l'inizializzazione prima che le dipendenze (promesse) sono risolti che creerebbe una race condition. Non lo vogliamo.

Quindi la domanda è, c'è un modo che possa contenere l'inizializzazione di un service finché tutte le promesse date non vengono risolte?

+1

Non si desidera [Inizializzazione manuale] (http://docs.angularjs.org/guide/bootstrap)? –

+1

L'impostazione di un callback per l'init manuale di una risoluzione di promessa funzionerebbe, tuttavia non è elegante, l'angolare ha un DI profondo, perché non possiamo trarne vantaggio? Come * se la dipendenza è una promessa, risolvila prima di andare oltre * –

+0

Poiché non hai incluso il tuo codice effettivo delle tue app, non posso dirlo, ma penso che queste domande riguardino lo stesso problema: http://stackoverflow.com/questions/12265565/angularjs-promise-is-resolved-before-data-is-loaded? rq = 1 –

risposta

5

Ho visto un problema simile. Una soluzione un po 'elegante di un compagno di squadra impiegato era una combinazione con RequireJS ed è modulo 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']); 
    }); 

}); 

Nel metodo init si può fare tutto il precarico (e attendere le promesse desiderati). Sono interessato a sentire altre soluzioni, naturalmente.

+0

Perché usare domReady? angular ha la propria funzione angular.element (document) .ready() (che è un wrapper attorno a jQueryLite). – asgoth

+0

domReady non è necessario, ma con RequireJS è un po 'più ordinato, tutto qui. – iwein

+0

Ma come funzionerà? 'PendingServices' è un modulo che usa $ timeout per caricare il suo contenuto? – asgoth

1

Pensare solo a caricare qui, ma che dire di solo dichiarare 1 "catch all" route per iniziare, e in quel provider di route, mantenere il caricamento del percorso fino a quando non hai fatto tutto il necessario. (usando la risoluzione e le promesse).

Quindi, una volta terminato, registrare i percorsi rimanenti e ricaricare il percorso originale. Questa volta, un gestore più specifico dovrebbe essere registrato e ignorerà l'inizializzatore 'catch all'.

Cosa ne pensi, eventuali problemi?

+0

E ovviamente si potrebbe usare tutti gli angolari DI – mcampster

Problemi correlati