函数返回错误结果
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