无法使用 forkJoin 创建 2 个独立的 Observable
Can't create 2 independent Observables with forkJoin
我有一个将 ID 作为参数并根据 ID 进行 HTTP 调用的函数。它 returns 是一个 Observable。本以为不同参数的调用是完全独立的,但它们相互影响。
我用
RxJS 5.0.0-beta.2
Angular 2.0.0-beta.7 用于 http 调用
打字稿 1.8.2
代码:
getCharacterDetails (id : number) : Observable<CharacterDetails> {
let keys : SpreadsheetKeys = this.characters[id];
if (!keys) {
return null;
}
let frontUrl : string = `${BASE_URL}/${CELLS}/${keys.spreadsheetKey}/${keys.frontWorksheetKey}/${OPTIONS}`;
let backUrl : string = `${BASE_URL}/${CELLS}/${keys.spreadsheetKey}/${keys.backWorksheetKey}/${OPTIONS}`;
return Observable.forkJoin(
this.http.get(frontUrl).map(response => response.json()),
this.http.get(backUrl).map(response => response.json()))
.map((response : any[]) => {
let character : CharacterDetails = EMPTY_MODEL;
console.log(JSON.stringify(character)); // The 1st console.log
applyFrontSheetToCharacter(response[0], character);
applyBackSheetToCharacter(response[1], character);
console.log(JSON.stringify(character)); // The 2nd console.log
return character;
});
}
预期行为:
我打电话
getCharacterDetails(1).subscribe((details) => { this.details = details }));
第一个 console.log 打印我的 EMPTY_MODEL.
第二个 console.log 打印 ID 1 的角色模型。
那我打电话给
getCharacterDetails(2).subscribe((details) => { this.details = details });
第一个 console.log 打印我的 EMPTY_MODEL.
第二个 console.log 打印 ID 2 的字符模型。
实际行为:
我打电话
getCharacterDetails(1).subscribe((details) => { this.details = details }));
第一个 console.log 打印我的 EMPTY_MODEL.
第二个 console.log 打印 ID 1 的角色模型。
那我打电话
getCharacterDetails(2).subscribe((details) => { this.details = details });
第一个 console.log 打印 ID 1 的角色模型。 <- 问题
第二个 console.log 打印 ID 2 的字符模型。
为什么2个调用不是完全独立的?第二次调用如何知道第一次调用的数据?
问题很简单,我完全误用了 EMPTY_MODEL。它基本上是我在 .map() 函数中编辑的 class 范围的变量。
与 RxJS、Angular 或 HTTP
无关的愚蠢错误
我有一个将 ID 作为参数并根据 ID 进行 HTTP 调用的函数。它 returns 是一个 Observable。本以为不同参数的调用是完全独立的,但它们相互影响。
我用
RxJS 5.0.0-beta.2
Angular 2.0.0-beta.7 用于 http 调用
打字稿 1.8.2
代码:
getCharacterDetails (id : number) : Observable<CharacterDetails> {
let keys : SpreadsheetKeys = this.characters[id];
if (!keys) {
return null;
}
let frontUrl : string = `${BASE_URL}/${CELLS}/${keys.spreadsheetKey}/${keys.frontWorksheetKey}/${OPTIONS}`;
let backUrl : string = `${BASE_URL}/${CELLS}/${keys.spreadsheetKey}/${keys.backWorksheetKey}/${OPTIONS}`;
return Observable.forkJoin(
this.http.get(frontUrl).map(response => response.json()),
this.http.get(backUrl).map(response => response.json()))
.map((response : any[]) => {
let character : CharacterDetails = EMPTY_MODEL;
console.log(JSON.stringify(character)); // The 1st console.log
applyFrontSheetToCharacter(response[0], character);
applyBackSheetToCharacter(response[1], character);
console.log(JSON.stringify(character)); // The 2nd console.log
return character;
});
}
预期行为:
我打电话
getCharacterDetails(1).subscribe((details) => { this.details = details }));
第一个 console.log 打印我的 EMPTY_MODEL.
第二个 console.log 打印 ID 1 的角色模型。
那我打电话给
getCharacterDetails(2).subscribe((details) => { this.details = details });
第一个 console.log 打印我的 EMPTY_MODEL.
第二个 console.log 打印 ID 2 的字符模型。
实际行为:
我打电话
getCharacterDetails(1).subscribe((details) => { this.details = details }));
第一个 console.log 打印我的 EMPTY_MODEL.
第二个 console.log 打印 ID 1 的角色模型。
那我打电话
getCharacterDetails(2).subscribe((details) => { this.details = details });
第一个 console.log 打印 ID 1 的角色模型。 <- 问题
第二个 console.log 打印 ID 2 的字符模型。
为什么2个调用不是完全独立的?第二次调用如何知道第一次调用的数据?
问题很简单,我完全误用了 EMPTY_MODEL。它基本上是我在 .map() 函数中编辑的 class 范围的变量。 与 RxJS、Angular 或 HTTP
无关的愚蠢错误