条件 Observable.forkJoin() 建筑
Conditional Observable.forkJoin() building
根据我要构建forkJoin()方法的函数的参数。
例如:
- 如果 parameter1 为空 => 不要将它的 http 请求放在
forkJoin()
- 如果参数 2 为空 => 不要为它发出 http 请求
在 forkJoin()
里面
代码:
getAllByIds(parameter1: any, parameter2: any) {
let itemList = new Array();
return Observable.forkJoin(
this.http.get('rest/fillin/ids/' + parameter1) // don't put this request for parameter1 if it is empty
.map((res: Response) => res.json()),
this.http.get('rest/textitem/ids/' + parameter2) // don't put this request for parameter2 if it is empty
.map((res:Response) => res.json())
).map(
data => {
itemList.push(data[0]);
itemList.push(data[1]);
return itemList;
}
);
}
那么,是否可以像这样构建 forkJoin()?
实际上这取决于您在跳过某些 HTTP 请求时期望得到什么。
forkJoin()
的输出应该包含 null
值还是完全忽略它?
function mockHTTPRequest(id) {
return Observable.of(id).delay(100);
}
let parameter1 = 'a';
let parameter2 = false;
let sources = [];
if (parameter1) {
sources.push(mockHTTPRequest('rest/fillin/ids/' + parameter1));
}
if (parameter2) {
sources.push(mockHTTPRequest('rest/textitem/ids/' + parameter2));
}
Observable.forkJoin(...sources)
.map(data => {
console.log(data.length);
return data;
})
.subscribe(values => console.log(values));
观看现场演示:https://jsbin.com/qorulel/5/edit?js,console
如果 parameter1
或 parameter2
为假,此解决方案不会创建源 Observable。请注意,console.log(data.length)
可以从 0
到 2
,具体取决于 parameterX
值。
或者您可以只创建 Observable.of(null)
而不是 HTTP 请求。
function mockHTTPRequest(id) {
return Observable.of(id).delay(100);
}
let parameter1 = 'a';
let parameter2 = false;
let sources = [
parameter1 ? mockHTTPRequest('rest/fillin/ids/' + parameter1) : Observable.of(null),
parameter2 ? mockHTTPRequest('rest/textitem/ids/' + parameter2) : Observable.of(null)
];
Observable.forkJoin(...sources)
.map(data => {
console.log(data.length);
return data;
})
.subscribe(values => console.log(values));
观看现场演示:https://jsbin.com/caheno/5/edit?js,console
现在输出总是有 2 个值。其中一些是 null
.
根据我要构建forkJoin()方法的函数的参数。
例如:
- 如果 parameter1 为空 => 不要将它的 http 请求放在 forkJoin()
- 如果参数 2 为空 => 不要为它发出 http 请求 在 forkJoin() 里面
代码:
getAllByIds(parameter1: any, parameter2: any) {
let itemList = new Array();
return Observable.forkJoin(
this.http.get('rest/fillin/ids/' + parameter1) // don't put this request for parameter1 if it is empty
.map((res: Response) => res.json()),
this.http.get('rest/textitem/ids/' + parameter2) // don't put this request for parameter2 if it is empty
.map((res:Response) => res.json())
).map(
data => {
itemList.push(data[0]);
itemList.push(data[1]);
return itemList;
}
);
}
那么,是否可以像这样构建 forkJoin()?
实际上这取决于您在跳过某些 HTTP 请求时期望得到什么。
forkJoin()
的输出应该包含 null
值还是完全忽略它?
function mockHTTPRequest(id) {
return Observable.of(id).delay(100);
}
let parameter1 = 'a';
let parameter2 = false;
let sources = [];
if (parameter1) {
sources.push(mockHTTPRequest('rest/fillin/ids/' + parameter1));
}
if (parameter2) {
sources.push(mockHTTPRequest('rest/textitem/ids/' + parameter2));
}
Observable.forkJoin(...sources)
.map(data => {
console.log(data.length);
return data;
})
.subscribe(values => console.log(values));
观看现场演示:https://jsbin.com/qorulel/5/edit?js,console
如果 parameter1
或 parameter2
为假,此解决方案不会创建源 Observable。请注意,console.log(data.length)
可以从 0
到 2
,具体取决于 parameterX
值。
或者您可以只创建 Observable.of(null)
而不是 HTTP 请求。
function mockHTTPRequest(id) {
return Observable.of(id).delay(100);
}
let parameter1 = 'a';
let parameter2 = false;
let sources = [
parameter1 ? mockHTTPRequest('rest/fillin/ids/' + parameter1) : Observable.of(null),
parameter2 ? mockHTTPRequest('rest/textitem/ids/' + parameter2) : Observable.of(null)
];
Observable.forkJoin(...sources)
.map(data => {
console.log(data.length);
return data;
})
.subscribe(values => console.log(values));
观看现场演示:https://jsbin.com/caheno/5/edit?js,console
现在输出总是有 2 个值。其中一些是 null
.