переменная определяется в ионной - PullRequest
0 голосов
/ 15 ноября 2018

Я объявил переменную в конструкторе, как показано ниже

constructor(public http: HttpClient) {
    this.data = null;
    this.http.get(this.url).subscribe((datas: any) => {
      this.dbUrl = datas[0].db_url2;
      console.log(this.dbUrl) // <- this output
    })
  }

Здесь я вижу свой вывод как

987456321

Но я объявляю переменную в том же классе другим методом.

getDetails() {
    let headers = new HttpHeaders();
    headers.append('Content-Type','application/json');
    console.log(this.dbUrl); // <- this output
    return this.http.get(this.dbUrl + 'details', { headers: headers})

  }

Когда я отображаю вывод, он отображается как Undefined. dbUrl является глобальной переменной. Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 16 ноября 2018

В первой части кода вы делаете HTTP-вызов, и этот вызов подписывается на Observable, это означает, что он не возвращает результат немедленно (так как это веб-запрос). Он наблюдает за http.get изменениями.

Во второй части кода вы регистрируете dbUrl, но выполнение вашего кода быстрее, чем время, необходимое вашему приложению для выполнения запроса. Так вот почему dbUrl не установлен во втором журнале:

1) dbUrl не определено
2) Вы вызываете функцию http.get, которая ожидает от сервера
3) Вы звоните getDetails, и вы регистрируете dbUrl, что является нулевым
4) Вы получаете ответ от сервера, а затем вы устанавливаете dbUrl

Вот что вы можете сделать:

// Create a method to get the dbUrl. This functions will return a `promise`.
getUrl(){
    return new Promise<any>(
    function (resolve, reject) {
      this.http.get(this.url).subscribe((datas: any) => {
        this.dbUrl = datas[0].db_url2;
        resolve(this.dbUrl);
      }
}

А затем измените ваш getDetails метод:

getDetails() {
    // If `this.dbUrl` has not been set yet
    if(this.dbUrl == undefined){
          this.getUrl()
          .then(url => {
            this.dbUrl = url;
            this.getDetails();
           })
          .catch(error => console.log(error))
        })
    }else{
        let headers = new HttpHeaders();
        headers.append('Content-Type','application/json');
        return this.http.get(this.dbUrl + 'details', { headers: headers})
    }
}

Когда вы вызовете getDetails, если dbUrl еще не готов, он будет ждать его значения, а затем рекурсивно вызовет getDails и, наконец, выполнит ваш запрос

...