【问题标题】:Calling a service in a service and returning async result?在服务中调用服务并返回异步结果?
【发布时间】:2018-02-20 15:10:19
【问题描述】:

使用 Angular 5。组件调用服务。在进行服务器调用之前,该服务必须调用另一个服务。我无法在组件中异步获取结果。为了简洁起见,我在下面使用省略号。

组件:

...
import { SystemOnlineService } from '../services/system-online.service';
...
constructor(private sys: SystemOnlineService) {
    sys.getStatus()
    .then(result => {
        console.log(result);
    });
}

系统在线服务:

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。

我想我只是错过了有关如何正确进行异步调用的一些内容。

【问题讨论】:

    标签: angular wakanda


    【解决方案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)) )
      })
    }
    

    【讨论】:

    • 你也应该在 ngOnInit 方法上调用该方法,因为如果你把代码放在构造函数中只会被调用一次
    • 谢谢,这段代码对我来说是正确的。我会记得为异步运行的函数返回一个承诺。
    • 即使我将代码放在 ngOnInit() 中,Ricardo 也不会只调用一次代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多