Вызов сервиса в сервисе и возвращение асинхронного результата?

Использование 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)) )
  })
}
Другие вопросы по тегам