2016-05-18 2 views
1
var final; 
final = $http.get('http://localhost:9000/therapist_data',config) 
      .success(function(response) { 
      console.log("I got the data I requested"); 
      var resdata = response; 
      console.log(resdata); 
      return resdata; 
     }); 

console.log(final); 

Я пытаюсь вернуть данные ответа и сохранить его в конечной переменной, вместо этого я получаю объект обещания.
Как вернуть фактические данные?

+0

Возможно, вы захотите создать свой собственный сервис. –

+0

var final defined –

ответ

3

Я попытаюсь разработать Cyril ответ на основе кода:

var final; 
final = $http.get('http://localhost:9000/therapist_data',config) 
     .success(function(response) { 
     console.log("I got the data I requested"); 
     var resdata = response; 
     console.log(resdata); 
     return resdata; 
    }); 

console.log(final); 

Вот порядок исполнения:

  1. var final
  2. $http.get('http://localhost:9000/therapist_data',config) .success();: это вызовет запрос и регистрации успешная функция в качестве обратного вызова, когда сервер ответит на ваш запрос
  3. console.log(final); -> так еще не определено. Он НЕ ЖДЕТ для ответа.
  4. несколько раз позже ... ваша функция в успехе называется.

Это саму основу обратных вызовов и асинхронной обработки, вы не знаете, когда она будет выполнена, или, по крайней мере, она будет часто выполняться после всего остального кода. В angularJS нет возможности выполнить синхронный запрос. Вы должны переместить код в функцию успеха.

+0

Все верно, порядок исполнения очень приятный, +1! –

0

$ http.get всегда вернет обещание.
Если вы хотите, чтобы получить значение обещание, вы должны сделать это внутри success обратного вызова, например:

var final; 
$http.get('someUrl').success(function(response) { 
final = response; 
}); 

Нет необходимости в resData, будет вызывать только обещание цепи, что-то вам не требуется в Это дело.

+0

Пробовал это, но когда я определяю окончательный успех, его область действия остается только локальной функцией успеха. За пределами конечной переменной все еще остается неопределенным. –

+0

Когда вы отлаживались, удалили ли вы функцию успеха? возможно, обещание было отклонено, а «окончательное» не было изменено. – AranS

+0

Были случаи, когда я объявлял свойства компонента, а затем в конструкторе вызывали асинхронную функцию. После того как обещание было возвращено, я заполнил свойства (используя «then»). Мне непонятно, почему переменная _final_ не входит в сферу действия. @ Кирилл Гандон? – AranS

2

Пока вы делаете сетевой вызов, ваши данные возвращаются обратно асинхронно, это его характер, вы не можете бороться с ним.

var wrongFinal; // <-- nope, final will never get into that scope 
$http.get('http://localhost:9000/therapist_data',config) 
    .success(function(response) { 
    console.log("I got the data I requested"); 
    var goodFinal = reponse; // <-- yes, here, the data lived 
    // do something with the data here 
}); 

console.log(wrongFinal); // nop, wrong scope, no sense, data doesn't live here 

Soooooo, ответ на этот вопрос:

Что вы хотите сделать с вашими данными?

Это зависит от пункта назначения. Вы собираетесь сделать анонимный сетевой звонок? Вы хотите обновить представление? Вы хотите позвонить в стороннюю библиотеку?

Вам необходимо понять и охватить природу асинхронного использования в JavaScript.

+0

Да, на самом деле вышеуказанный код находится внутри другой функции успеха другого http get.Its вложенных сетевых вызовов. –

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