У меня ниже код в угловом сервисе
this.get = function(url,qParams)
{
var webresponse = new Object();
$http.get(url+qParams)
.success(function(result){
webresponse.data = result;
webresponse.state = 1;
})
.error(function(result){
webresponse.data = result;
webresponse.state = 0;
});
console.log('webresponse :' + webresponse.data);
return webresponse;
}
В консольном журнале отображается webresponse.data
как undefined
. Пожалуйста, помогите мне понять, почему. Это вопрос о масштабах?
просто чтобы вы знали, что result
является массив JSON и в консольном журнале он показывает массив JSON, как и ожидалось, со всеми элементами в нем.
Вызов метода в $http
асинхронен: результат не будет доступен после .get()
функции .get()
. Повторите проверку документов за $http
.
Данные в webresponse
будут недоступны (т. webresponse
Ваша переменная еще не установлена ничем, кроме простого объекта), но только тогда, когда запрос $http.get
извлекает данные с сервера. Такие моменты являются триггером .success
триггером .error
, а также триггером, который вы не использовали (и, возможно, не нуждаетесь), вызванным .finally
(работает независимо от того, .success
ли .success
и .error
).
Вы не можете получить доступ к webresponse вне этих обратных вызовов, так как они являются единственными гарантированными моментами, когда такие значения будут доступны. Даже больше! Вы не можете ВОЗВРАТИТЬ такое значение из функции. Поскольку поведение является асинхронным, вам придется возвращать что-то одним и тем же асинхронным способом. Пожалуйста, проверьте службу $q
чтобы узнать, как это сделать. Это длинная тема, и вам не хватает оснований по этой теме, поэтому я дам вам несколько рекомендаций:
$http
- это асинхронный сервис. Их вызовы (например, .get()
возвращают что-то, называемое обещанием. Ваша функция должна возвращать обещание (то же или другое).$http
и $q
. Они хорошо документированы в официальных документах. Ваш $http.get()
- это async
вызов, а ваш console.log
- синхронно, поэтому console.log
инициировал сначала, а затем ваш $http
.
async
не ожидает результата, хотя обычно поддерживается в циклах событий.
this.get()
не может сразу вернуть результат.
Как вы знаете, в модуле $ http используется ajax, (AJAX: асинхронный Javascript и Xml)
так что вы должны ждать асинхронного ответа на ваш success
или error
функции обратного вызова.
Если вы хотите вернуть ответ, рассмотрите образец promise
.
вы используете синхронный вызов.
this.get = function(url,qParams)
{
var webresponse = new Object();
$http.get(url+qParams)
.success(function(result){
webresponse.data = result;
webresponse.state = 1;
console.log('webresponse :' + webresponse.data);
//triger any function @here when its success
})
.error(function(result){
webresponse.data = result;
webresponse.state = 0;
console.log('webresponse :' + webresponse.data);
//triger any function @here when its fail
});
}
promise
в угловых. Спасибо большое друг.
get()
не ждет, пока придет результат