Глобальная переменная Ionic Framework - PullRequest
0 голосов
/ 06 июня 2019

Я работаю над геолокацией, проектом Google Maps.Я написал простой API и загрузил свой сервер.Я могу получить доступ к данным моего API с помощью

export class Tab2Page implements OnInit, AfterContentInit {
getLat: any;
getLong: any;
        constructor(private geolocation: Geolocation, public http: HttpClient) {
        this.http.get("apilink").subscribe(data => 
        {
          this.getLat = data["lat"];
          this.getLong = data["long"];
        });
       console.log(this.getLat); //gives undefined
      }
}

Но когда я хочу получить переменную getLat и getLong из любой функции - или за пределами this.http.get () - переменные дают неопределенное значение.Что я должен делать?Я пробовал static, const, global, var объявляет и т. Д.

ngAfterContentInit(): void {
console.log(this.getLat); //gives undefined
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Это происходит из-за асинхронного запроса ..

this.http.get("apilink").subscribe(data => // this started to execute but due to async request it will update once you get confirmation.
{
 this.getLat = data["lat"];
 this.getLong = data["long"];
});
console.log(this.getLat); //gives undefined (This executed before request return)

Ваш HTTP-запрос только начал выполняться, но до его завершения консоль начала выполняться, причина в том, что http-запрос был асинхронным.

, поэтому убедитесь, что он синхронизирован, или используйте $.when $.then, позвоните на консоль внутри $(then)

0 голосов
/ 06 июня 2019

Причина этого в том, что изначально getLat и getLong оба равны нулю, что дает undefined, потому что вы не присвоили им никакого значения.

Почему это работает внутри подписки?

Это потому, что когда возвращается ответ на запрос HTTP. Обе переменные присваивают значения, используя

this.getLat = data["lat"];
this.getLong = data["long"];

Почему это не работает вне подписки?

Это связано с тем, что код внутри subscribe является асинхронным, т. Е. Он будет выполняться вне обычного выполнения программы и будет работать только тогда, когда ваш HTTP-запрос вернет ответ. Поскольку выполнение HTTP-запроса занимает некоторое время, а ваш console.log выполняется первым, результат будет undefined

Что вы можете сделать?

Если вы хотите выполнить фрагмент кода, который требует значений getLat и getLong, вы можете вызвать эту функцию внутри метода subscribe или если вам нужны эти значения вне вашего компонента, Вы можете создать Subject, затем в своем subscribe вы отправите данные на этот Subject, а затем в своем коде вы можете subscribe на него

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...