Вызов сервиса в сервисе и возвращение асинхронного результата?
Использование Angular 5. Компонент вызывает сервис. Эта служба должна вызвать другую службу перед выполнением вызова на сервере. Я не могу получить результат асинхронно в компоненте. Я использую эллипсы для краткости ниже.
Составная часть:
...
import { SystemOnlineService } from '../services/system-online.service';
...
constructor(private sys: SystemOnlineService) {
sys.getStatus()
.then(result => {
console.log(result);
});
}
SystemOnlineService:
import { Injectable } from '@angular/core';
import { Wakanda } from './wakanda.service';
import 'rxjs/add/operator/toPromise';
...
getStatus() {
this.wakanda.getCatalog()
.then((ds) => {
this.ds = ds;
this.ds.Rpc_reportObjectHelper.isMySystemUp()
.then(statusArr => {
return statusArr;
});
});
}
Компонент выдает эту ошибку о sys.getStatus()
вызов:
Uncaught (in promise): TypeError: Cannot read property 'then' of undefined
Если я console.log(sys.getStatus());
, это логи undefined
,
Я думаю, что мне просто не хватает того, как правильно делать асинхронные вызовы.
1 ответ
Решение
getStatus() должен вернуть обещание. Теперь он ничего не возвращает. Вы можете переписать так:
getStatus() {
return new Promise( resolve => {
this.wakanda.getCatalog()
.then((ds) => {
this.ds = ds;
return this.ds.Rpc_reportObjectHelper.isMySystemUp()
.then(statusArr => {
resolve(statusArr);
});
});
})
}
Или, что лучше, если этот блок кода не имеет никакой другой логики, вы можете удалить ненужный код (используя функции стрелок):
getStatus() {
return new Promise( resolve => {
this.wakanda.getCatalog()
.then( ds => ds.Rpc_reportObjectHelper.isMySystemUp().then( data => resolve(data)) )
})
}