2015-11-28 3 views
0

У меня есть ниже кода в угловой службеJavaScript Object/переменная проблема

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()' не дожидаться, пока не появится результат – azad

+1

http://stackoverflow.com/questions/14220321/how-do-i -return-the-response-from-a-асинхронный вызов – saadq

ответ

1

Вашего $http.get() является async вызовом и ваш console.log в синхронном режиме, так console.log инициировал первое, то ваш $http.

+0

@MarcoBonelli sync fashion означает, что мы обычно используем его (сохраняя его в более светлой ноте) в программировании означает выполнение строки за строкой и ожиданием, с другой стороны 'async' не ждет результата, хотя обычно поддерживается на событии Циклы – swapnesh

+1

Спасибо за эту разницу в синхронности/асинхронности $ http в угловом формате. Наверное, знал это и все еще пропустил это. Это то, что происходит, когда вы работаете 14 часов в день ... !!!! :) –

+0

@SherebyahTishbi ваш блокирующий код нарушает ваш синхронный жизненный цикл :) – swapnesh

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

Aww ..... как я пропустил весь этот аспект 'обещание' в угловом. Большое вам спасибо. –

1

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

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

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

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

Функция this.get() не может вернуть результат imme ственно.

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

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

Если вы хотите, чтобы вернуть ответ, пожалуйста, рассмотрите модель promise.

Смежные вопросы