我假设 iif (注释掉)与重写的 if 相同。Iif 返回到 switchMap。问题是,当涉及到时iif
,两个块(真块和假块)都被执行了。这是为什么?
private sendRequest<T>(
method: EQueryMethod,
url: string,
body: any,
headers: RequestHeaders,
type: 'json' | 'multipart'
): Observable<T> {
const platform = Capacitor.getPlatform();
return of({}).pipe(
switchMap(
(s) => {
if (platform === 'android') {
return this.sendRequestAndroid(method, url, body, headers, type);
} else {
return this.sendRequestWeb(
method,
url,
method === EQueryMethod.GET ? {} : body,
method === EQueryMethod.POST ? {} : body,
headers
);
}
}
// iif(
// () => platform === 'android',
// this.sendRequestAndroid(method, url, body, headers, type),
// this.sendRequestWeb(
// method,
// url,
// method === EQueryMethod.GET ? {} : body,
// method === EQueryMethod.POST ? {} : body,
// headers
// )
// )
),
take(1)
);
}
底线是如果!= iif。
iif 评估两个可观察对象,但仅返回一个,具体取决于条件。而普通的 if 只执行与条件匹配的那个。这种行为通常出现在复杂的结构上,而在简单的结构上,行为似乎与 if 相同。
来自文档:在订阅时检查布尔值,并在两个可观察源之一之间进行选择。已翻译:在订阅时检查布尔值并选择两个可观察源之一。
因此,订阅了恰好两个源,并且选择了一个。
你可以在这里阅读更多