2015-02-19 12 views
6

Pracuję nad projektem angularJs i maszynopisu. Muszę wykonać synchroniczne wywołanie http i pobrać dane z serwera przed uruchomieniem aplikacji klienckiej i załadowaniem interfejsu użytkownika. Szukam w Internecie i widzę, że wszyscy mówią o obietnicy, huumm okej, czemu nie. Używam więc obietnicy (wykonaj $ HTTP call i użyj $ q, aby zwrócić obietnicę) w moim app.run(). Może niczego nie brakuje, bo to w ogóle nie działa. Angularowe uruchomienie app.config(), a następnie app.run(), ... Ale Angular nie czeka app.config() na zakończenie przed uruchomieniem app.run(). Tak więc, moja pierwsza obietnica to uruchomienie w app.run() i zanim ona rozwiązuje Angulara, spróbuj utworzyć instancję kontrolera ... Nie chcę tworzyć nowego połączenia usługi httpSynchronous, ale nie mam żadnych innych pomysłów.Obietnica AngularJS w app.run()

+2

Zaktualizuj za pomocą kodu: D – Seth

+0

Czy możesz przenieść synchroniczne wywołanie http do pliku app.run? Następnie możesz użyć swojego kodu, który zależy od wyniku w bloku sukcesu. –

Odpowiedz

14

Kątowy nie obsługuje asynchronicznych akcji w funkcjach .config i .run. Jeśli chcesz opóźnić swoje zgłoszenie, możesz to zrobić na dwa sposoby:

  • Pierwszym z nich jest opóźnienie całej aplikacji za pomocą metody angle.bootstrap() w celu ręcznego uruchomienia. Ale wszystko, co robisz, jest poza zakresem, więc nie masz dostępu do niczego oprócz wanilii JavaScript.
  • Drugi to użycie właściwości resolve twoich tras. Jeśli używasz routera takiego jak angular route segment lub ui router, możesz określić górną trasę/stan z rozwiązaniem, które zostanie rozwiązane po załadowaniu aplikacji (i jeśli wymusisz pełne przeładowanie trasy).
+0

Dziękuję za odpowiedź, ale nie mogę użyć pierwszego rozwiązania, ponieważ muszę wykonać wielokrotne wywołanie http i zainicjować składnik angularJs (usługa, dyrektywa, ...), więc to rozwiązanie będzie bardzo brzydkie. I już widzę to rozwiązanie w Internecie, ale umieszczenie całej tej logiki w definicji mojej trasy nie jest właściwą drogą. Resolve służy do rozstrzygania usług dla kontrolera i nie jest to moim celem. –

+0

Tak, też bym tego nie zrobił. Ale wciąż jest to możliwe;) –

+2

@Tonkar rozwiązać może być używane dla wielu rzeczy –

Powiązane problemy