2016-12-08 2 views
0

Я новичок в угловом и использую angular 2 with typescript и имею проблему с помещением значений в переменные.Как получить результат асинхронного вызова в области родительской функции

Также я видел машинопись документацию о let и это блок обзорное: https://www.typescriptlang.org/docs/handbook/variable-declarations.html

Но проблема может быть связана с third log вызывался перед тем second log, который является Ajax запрос вызова сервера.

Это мой код, где я использую let:

getData() { 
    let value : any; 
    console.log('first console log:'+value); 
    this.http 
     .get('api/get') 
     .map(response => response.json()) 
     .subscribe(response => { 
      value = response; 
      console.log('second console log:'+value); 
     }); 
    console.log('third console log:'+value); 
} 

И выход:

first console log:undefined 
third console log:undefined 
second console log:[object Object] 

Как я получить значение ответа в переменную?

+1

Он попадает в переменную. В «втором журнале консоли». Потому что код асинхронный. – estus

+0

то, что здесь происходит, - это то, что он печатает первую консоль, а не напрямую печатает третью консоль и в последнем ее втором журнале печати. я столкнулся с такой же проблемой. Я думаю, что код работает async, поэтому происходит. если вы нашли какое-либо решение, пожалуйста, обновите его здесь. –

+0

@ VinayPandya какое решение? Нет проблем/вопросов. – echonax

ответ

0

Ваш вызов ajax является асинхронным. Таким образом, .subscribe() прибудет при разрешении вызова ajax. Третий console.log находится в главном потоке приложения и будет выполняться непосредственно после того, как вызов ajax будет запущен в другом потоке. Таким образом, ваше значение еще не начато.

Если бы вы написали этот код с помощью функции обратного вызова может быть более ясно, что происходит:

getData() { 
    let value : any; 
    this.http.get('api/get', (res, err) => { 
    value = res; 
    console.log('second console log:' + value); 
    }); 
    console.log('third console log:' + value); 
} 

раствора без Rx будет использовать обещание

getData() { 
    let value : any; 
    this.http.get('api/get') 
    .then(res => { 
     value = res; 
     console.log('second console log:' + value); 
    }); 
    console.log('third console log:' + value); 
} 

Но вы должны понимать его это просто лингво, чтобы скрыть обратный вызов и дать вам цельный код .then().

Настоящая проблема заключается в том, что третья консольная линия находится в основном потоке (когда вы входите в функцию getData()), и асинхронный код будет запланирован на другой поток для запуска в своем собственном темпе. Таким образом, третий консольный журнал никогда не будет согласован с этим кодом.

Исправление состоит в том, чтобы добавить третью консольную строку журнала в .subscribe(), .then() или обратный вызов по любому пути, который вы выберете.

+0

Так что же такое решение @mark. можем ли мы использовать для этого обещание? –

+0

ответит решить проблему? –

+0

Я не думаю, что редактирование вопроса так, как вы это сделали, уместно. Вопрос действительно расплывчатый, и я признаю, что вы изменили это имеет смысл, но OP уже сказал: «Проблема может быть связана с тем, что третий журнал получает вызов до второго журнала, который является аякс-запросом, вызывающим сервер». поэтому это указывает, что OP знает об асинхронном характере. И почему вы удалили теги 'angular2',' rxjs' и 'observable'? Это код 'angular2', использующий' наблюдаемый' из библиотеки 'rxjs'. – echonax

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