使用 Angular、RxJs 6 和 InMemoryAPI 如何获得似乎嵌套在多个可观察源中的返回可观察值?
Using Angular, RxJs 6 and InMemoryAPI how do I get a returned Observable value that seems to be nested in multiple observable sources?
我正在尝试使用 Angular 7+、RxJS 6+ 和 InMemoryAPI 创建一个模拟 API 来测试我的前端 GUI。这是我的 "in-memory-data-.service.ts":
export class InMemoryDataService implements InMemoryDbService {
// HTTP POST interceptor
post(reqInfo: RequestInfo) {
console.log('Caught POST:');
console.log(reqInfo);
if (reqInfo.collectionName === 'myApiUrlSign') {
console.log('Return generated myObject');
const reportResponse = new MyObject();
reportResponse.id = reqInfo.utils.getJsonBody(reqInfo.req);
reportResponse.time = new Date();
const response: ResponseOptions = {
body: reportResponse,
status: STATUS.OK
};
const observable = of(response);
console.log('In Memeory data service = ');
console.log(observable);
return observable;
}
return undefined; // Let the default POST handle all others
}
// Example DB Collection
createDb() {
const heroes = [
{ id: 11, name: 'Mr. Nice' },
{ id: 12, name: 'Narco' }
];
return {heroes};
}
}
那么我的服务就是一个简单的 post 调用:
generateMyObject(myId: string): Observable<MyObject> {
return this.http.post<MyObject>(
this.apiUrl,
JSON.stringify({ myId }),
{ headers: this.headers }
);
}
最后我的组件onSubmit函数如下:
onSubmit() {
const self = this;
const formModel = this.myForm.value;
const obs = this.myService.generateMyObject(formModel.myId);
console.log('On Submit Observer = ');
console.log(obs);
obs.subscribe((data: MyObject) => { // On Next()
console.log('MyObject recieved');
console.log(data);
self.myObject = data;
},
error => console.log(error), // On Error()
() => console.log('Completed')); // On Completed()
console.log(this.myObject);
}
除了我的观察者 next 函数从未被调用而 "Completed" 函数被调用外,一切正常。 "InMemoryDataService" returns 内的控制台记录具有预期 "MyObject" 值的正确可观察值。虽然,在我的 Angular 组件 console.log 中返回了一个不同的可观察值。它具有正确的 MyObject 值,但在 3 个父 Observable.source 对象中看起来是 "nested"。因此,如果我使用以下赋值,则 next() 函数会被正确调用:
const obs = this.reportGenService.generateReport(formModel.orderId)
.source.source.source;
这太奇怪了,当我将鼠标悬停在 IDE 中的“.source”上时,提示说它已被弃用。如何在不使用多个“.source”调用的情况下让它工作?我确定我错过了什么,我只是不知道是什么。非常感谢您的帮助。
使用 reqInfo.utils.createResponse$()
而不是 Observable.of()
。
我正在尝试使用 Angular 7+、RxJS 6+ 和 InMemoryAPI 创建一个模拟 API 来测试我的前端 GUI。这是我的 "in-memory-data-.service.ts":
export class InMemoryDataService implements InMemoryDbService {
// HTTP POST interceptor
post(reqInfo: RequestInfo) {
console.log('Caught POST:');
console.log(reqInfo);
if (reqInfo.collectionName === 'myApiUrlSign') {
console.log('Return generated myObject');
const reportResponse = new MyObject();
reportResponse.id = reqInfo.utils.getJsonBody(reqInfo.req);
reportResponse.time = new Date();
const response: ResponseOptions = {
body: reportResponse,
status: STATUS.OK
};
const observable = of(response);
console.log('In Memeory data service = ');
console.log(observable);
return observable;
}
return undefined; // Let the default POST handle all others
}
// Example DB Collection
createDb() {
const heroes = [
{ id: 11, name: 'Mr. Nice' },
{ id: 12, name: 'Narco' }
];
return {heroes};
}
}
那么我的服务就是一个简单的 post 调用:
generateMyObject(myId: string): Observable<MyObject> {
return this.http.post<MyObject>(
this.apiUrl,
JSON.stringify({ myId }),
{ headers: this.headers }
);
}
最后我的组件onSubmit函数如下:
onSubmit() {
const self = this;
const formModel = this.myForm.value;
const obs = this.myService.generateMyObject(formModel.myId);
console.log('On Submit Observer = ');
console.log(obs);
obs.subscribe((data: MyObject) => { // On Next()
console.log('MyObject recieved');
console.log(data);
self.myObject = data;
},
error => console.log(error), // On Error()
() => console.log('Completed')); // On Completed()
console.log(this.myObject);
}
除了我的观察者 next 函数从未被调用而 "Completed" 函数被调用外,一切正常。 "InMemoryDataService" returns 内的控制台记录具有预期 "MyObject" 值的正确可观察值。虽然,在我的 Angular 组件 console.log 中返回了一个不同的可观察值。它具有正确的 MyObject 值,但在 3 个父 Observable.source 对象中看起来是 "nested"。因此,如果我使用以下赋值,则 next() 函数会被正确调用:
const obs = this.reportGenService.generateReport(formModel.orderId)
.source.source.source;
这太奇怪了,当我将鼠标悬停在 IDE 中的“.source”上时,提示说它已被弃用。如何在不使用多个“.source”调用的情况下让它工作?我确定我错过了什么,我只是不知道是什么。非常感谢您的帮助。
使用 reqInfo.utils.createResponse$()
而不是 Observable.of()
。