开发者问题收集

函数返回错误结果

2021-02-20
182

我遇到一个问题,即某个函数返回了错误的返回值,而不是正确的返回值。

模型:

export  module AbsModule {
    export class AbsModul{
        abs: string;
        state: boolean;
    }
  }

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { environment } from '../../environments/environment';
import { httpFactory } from '@angular/http/src/http_module';
import { AbsModule } from './abs-module';

@Injectable()
export class AbsService {
    private apiUrl: string = environment.apiUrl;
    constructor(private http: HttpClient) { }

    getAbs(): object {
           return  this.http.get(this.apiUrl + "/abs/download").subscribe(data => {
               const returnFromFunction = this.assigneAbs(data);
               console.log(returnFromFunction);
               console.log(data);
               return returnFromFunction;

            })
    }

    private assigneAbs(data: object) {
        return Object.assign(new AbsModule.AbsModul(), data);
    }

}

调用函数:

@Component({})
export class TestClass  {
constructor(
    private tests: AbsService
) {}
test(): void {
    console.log(this.tests.getAbs())
}}

之后,我收到来自 subscribe 的返回值,而不是 returnFromFunction。当我首先调用此函数时,我看到来自测试函数的订阅者的返回值,然后我看到来自 returnFromFunction 和数据的控制台日志。返回 returnFromFunction 不起作用 - 它不会返回此结果。

2个回答

现在您只需返回由 http.get 方法返回的可观察对象。您可以通过等待响应到来然后返回解析和处理的值来解决此问题。

async getAbs(): Promise<object> {
    const response = await this.http.get(this.apiUrl + "/abs/download").toPromise();
    return this.assigneAbs(response);
}

getAbs 现在是一种异步方法,因此您必须在测试套件中适当地处理它。

async test(): Promise<void> {
    console.log(await this.tests.getAbs());
}
Michał Łuczak
2021-02-20

http.get(...) 方法返回一个可观察对象,而 subscribe 方法返回一个 Subscription 类型的对象。

现在,传递给 subscribe 方法的参数实际上是一个回调,即返回 void 的函数。因此,让这样的回调返回实际值(在您的情况下为“returnFromFunction”)是没有意义的。

可观察对象充当发布者,通知其观察者一些新数据,因此更好的方法是让服务公开一个可观察对象并让组件(以及测试器)订阅它:

export class AbsService {
    private apiUrl: string = environment.apiUrl;
    constructor(private http: HttpClient) { }

    getAbs(): Observable<any> {
        return this.http.get(this.apiUrl + "/abs/download")
                        .map(data => this.assigneAbs(data));
    }

    private assigneAbs(data: object) {
        return Object.assign(new AbsModule.AbsModul(), data);
    }

}

export class TestClass {
    constructor(
        private tests: AbsService
    ) {}
    test(): void {
        this.tests.getAbs().subscribe(data => console.log(data));
    }
}
desertech
2021-02-20