2012-12-31 4 views
18

In routeProvider können wir die routing halten, wenn wir ein Entschlossenheitsobjekt geben, das Versprechen enthält; es würde warten, bis alle Versprechen gelöst sind. Allerdings konnte ich bei der Initialisierung der Anwendung keinen Weg finden.Halten Sie die Initialisierung eines Dienstes, bis alle Versprechen gelöst sind

Es gibt angular.module("app", []).run(function(){ //init app }) aber eine für $resource oder $http die async ist, kann die App Initialisierung beenden, bevor die Abhängigkeiten (Versprechen) aufgelöst, die eine race condition schaffen würde. Das wollen wir nicht.

Also die Frage ist, gibt es einen Weg, der die Initialisierung eines service halten würde, bis alle gegebenen Versprechen gelöst sind?

+1

Wollen Sie nicht [Manuelle Initialisierung] (http://docs.angularjs.org/guide/bootstrap)? –

+1

Einen Rückruf zu manueller Init eines Versprechens zu setzen Auflösung würde funktionieren, aber es ist nicht elegant, eckig hat eine große DI, warum können wir davon nicht profitieren? Wie * Wenn die Abhängigkeit eine Verheißung ist, löse sie, bevor du weiter gehst * –

+0

Da du deinen eigentlichen Apps-Code nicht eingebunden hast, kann ich das nicht sagen, aber ich denke, dass diese Frage das gleiche Problem behandelt: http://stackoverflow.com/questions/12265565/angularjs-promise-is-resolved-vor-data-is-loaded? rq = 1 –

Antwort

5

Ich habe ein ähnliches Problem gesehen. Eine etwas elegantere Lösung ein Teamkollege beschäftigt war eine Kombination mit RequireJS und es ist domready Modul:

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']); 
    }); 

}); 

In der init-Methode Sie alle Vorbelastung tun können (und für die gewünschten Versprechen warten). Ich bin natürlich daran interessiert andere Lösungen zu hören.

+0

Warum domReady verwenden? angular hat eine eigene angular.element (document) .ready() -Funktion (die einen Wrapper um jQueryLite darstellt). – asgoth

+0

DomReady ist nicht notwendig, aber mit RequireJS ist es ein bisschen sauberer, das ist alles. – iwein

+0

Aber wie wird das funktionieren? Ist 'pendingServices' ein Modul, das $ timeout verwendet, um seinen Inhalt zu laden? – asgoth

1

Denken Sie nur an die Last hier, aber wie wäre es mit nur 1 'alle fangen' Route zu beginnen, und in diesem Routenanbieter, halten Sie das Laden der Route, bis Sie alles getan haben, was Sie brauchen. (mit Entschlossenheit und Versprechen).

Wenn Sie fertig sind, registrieren Sie die verbleibenden Routen und laden Sie die ursprüngliche Route erneut. Dieses Mal sollte ein speziellerer Handler registriert werden, der den Initializer "catch all" umgeht.

Was denken Sie, irgendwelche Probleme?

+0

Und natürlich würden Sie alle Angulars DI verwenden – mcampster

Verwandte Themen