В первой части кода вы делаете 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
и, наконец, выполнит ваш запрос