Как установить переменную из вызова $ http, а затем использовать ее в остальной части приложения БЕЗ того, чтобы сделать все приложение асинхронным
У меня есть эти данные
{
"config": {
"RESTAPIURL": "http://myserver/myrestsite"
}
}
и у меня есть эта фабрика, которая читает эти данные
'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
}
}
]
);
Затем использовать
'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
};
});
Поэтому, когда я использую это, я делаюapi.URL()
и это не работает.
Раньше это был жестко запрограммированный URL, поэтому называть егоapi.URL
, Я действительно не хочу, чтобы пройти через все приложение и преобразовать все вapi.URL().then(...)
, Это было бы отстой.
Итак, как я могу записать это значение как «свойство» вместо асинхронного обещания, которое должно вызываться снова и снова?
Позвони один раз, хорошо. Получить значение. Положите это где-нибудь. Используйте значение. Никогда не называй$http
снова после этого.
РЕДАКТИРОВАТЬ
Похоже, это один из самых успешных вопросов, которые я когда-либо задавал, и я с благодарностью рассматриваю каждый ответ по очереди. Спасибо каждому из вас.