Wie man eine Variable aus einem $ http-Aufruf setzt und sie dann im Rest der Anwendung verwendet, OHNE die gesamte Anwendung asynchron zu machen

Ich habe diese Daten

{
  "config": {
    "RESTAPIURL": "http://myserver/myrestsite"
  }
}

und ich habe diese Fabrik, die diese Daten liest

'use strict';

angular.module('myApp').factory('api',
  ["$http", "$q",
  function ($http, $q) {

    function _getConfiguration() {
      var deferred = $q.defer();
      $http.get('/scripts/constants/config.json')
      .success(function (data) {
        deferred.resolve(data);
      })
      .error(function (data, status) {
        deferred.reject(data, status);
      });
      return deferred.promise;
    }

    function _restApiUrl() {
      // this doesn't work either. _getConfiguration() doesn't resolve here.
      return _getConfiguration().RESTAPIURL + '/api/';
    }

    return {
      URL: _restApiUrl
    }
  }
  ]
);

Dann, um es zu verwenden

'use strict';

angular.module('myApp').factory('AuthService', function ($http, $q, api,NotificationService) {

    function _get(creds) {

        var deferred = $q.defer();

        $http({method: 'GET', url: api.URL() + api.AUTH, headers: {
            'Authorization': 'Basic '+creds}
        })
        .success(function (data, status, results, headers) {
            deferred.resolve(results);
        })
        .error(function (data, status) {
            NotificationService.redirect(status);
            deferred.reject(data, status);
        });
        return deferred.promise;
    }

    return {
        get:_get
    };
});

Also, wenn ich es benutze, mache ichapi.URL() und es funktioniert nicht.

Früher war es eine fest codierte URL, so dass sie früher als @ bezeichnet wurdapi.URL. Ich möchte wirklich nicht die ganze App durchgehen und alles in @ konvertierapi.URL().then(...). Das wäre scheiße.

Wie kann ich diesen Wert als "Eigenschaft" anstelle eines asynchronen Versprechens festlegen, das immer wieder aufgerufen werden muss?

ufen Sie es einmal an, okay. Holen Sie sich den Wert. Stell es irgendwo hin. Verwenden Sie den Wert. Nenne niemals das$http wieder danach.

BEARBEITE

Dies wird zu einer der erfolgreichsten Fragen, die ich je gestellt habe, und ich gehe jede Antwort der Reihe nach dankbar durch. Vielen Dank an jeden von euch.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage