在服务中调用服务并返回异步结果?

时间:2018-02-20 15:10:20

标签: angular wakanda

使用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 个答案:

答案 0 :(得分:5)

' getStatus()'应该回报一个承诺。现在,它什么也没有回来。 你可以这样重写:

getStatus() {

  return new Promise( resolve => {
    this.wakanda.getCatalog()
    .then((ds) => {
        this.ds = ds;
        return this.ds.Rpc_reportObjectHelper.isMySystemUp()
        .then(statusArr => {
            resolve(statusArr);
        });
    });
  })
}

或者,事件更好,如果这段代码没有任何toher逻辑,你可以删除不必要的代码(使用箭头函数):

getStatus() {
  return new Promise( resolve => {
    this.wakanda.getCatalog()
    .then( ds => ds.Rpc_reportObjectHelper.isMySystemUp().then( data => resolve(data)) )
  })
}