объект JavaScript / переменная проблема

0

У меня ниже код в угловом сервисе

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, как и ожидалось, со всеми элементами в нем.

  • 1
    Вы должны console.log в успехе FN
  • 0
    это асинхронный вызов, функция get() не ждет, пока придет результат
Показать ещё 2 комментария
Теги:

4 ответа

1

Вызов метода в $http асинхронен: результат не будет доступен после .get() функции .get(). Повторите проверку документов за $http.

Данные в webresponse будут недоступны (т. webresponse Ваша переменная еще не установлена ничем, кроме простого объекта), но только тогда, когда запрос $http.get извлекает данные с сервера. Такие моменты являются триггером .success триггером .error, а также триггером, который вы не использовали (и, возможно, не нуждаетесь), вызванным .finally (работает независимо от того, .success ли .success и .error).

Вы не можете получить доступ к webresponse вне этих обратных вызовов, так как они являются единственными гарантированными моментами, когда такие значения будут доступны. Даже больше! Вы не можете ВОЗВРАТИТЬ такое значение из функции. Поскольку поведение является асинхронным, вам придется возвращать что-то одним и тем же асинхронным способом. Пожалуйста, проверьте службу $q чтобы узнать, как это сделать. Это длинная тема, и вам не хватает оснований по этой теме, поэтому я дам вам несколько рекомендаций:

  1. $http - это асинхронный сервис. Их вызовы (например, .get() возвращают что-то, называемое обещанием. Ваша функция должна возвращать обещание (то же или другое).
  2. Фактический результат (т.е. Нужный результат) не будет доступен по вашему усмотрению: функция invoker должна присутствовать на обещании, которое вы возвращаете, указать обратный вызов для него и посещать его в обратном вызове.
  3. Дополнительная информация: вам нужно более глубокое знание услуг $http и $q. Они хорошо документированы в официальных документах.
1

Ваш $http.get() - это async вызов, а ваш console.log - синхронно, поэтому console.log инициировал сначала, а затем ваш $http.

  • 0
    Способ синхронизации @MarcoBonelli означает, что мы обычно используем его (сохраняя его в более легкой форме) в программировании, означает, что построчное выполнение и ожидание, с другой стороны, async не ожидает результата, хотя обычно поддерживается в циклах событий.
  • 1
    Спасибо за эту разницу между Sync / Async и обещанием $ http в угловых. Вероятно, он знал это и до сих пор скучал. Это то, что происходит, когда вы работаете 14 часов в день ... !!!! :)
Показать ещё 1 комментарий
0

this.get() не может сразу вернуть результат.

Как вы знаете, в модуле $ http используется ajax, (AJAX: асинхронный Javascript и Xml)

так что вы должны ждать асинхронного ответа на ваш success или error функции обратного вызова.

Если вы хотите вернуть ответ, рассмотрите образец promise.

0

вы используете синхронный вызов.

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 

    });    
}
  • 0
    Ой ..... как я пропустил весь этот аспект promise в угловых. Спасибо большое друг.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню