【发布时间】:2018-09-30 06:50:41
【问题描述】:
我是 rxjs 的新手,似乎无法为我正在尝试做的事情找到正确的运算符。
在我的示例中,我有一个数组,我需要用另一个 observable 的结果来填充,一旦我在该数组中通过订阅调用获得了足够的结果,我想中断并返回该数组。
// for reference, there is a class variable called keys
result = getResults(data, index).subscribe((result: any[]) => {
doSomethingWith(result);
});
getResults(data: any[], index: number) : Observable<any[]> {
obsFunctionThatGetsMeData(keys[index]).subscribe(result =>
data = data.concat(result);
if(data.length >= NEEDED_NUM_DATA) {
return Observable.of(data);
} else {
/* need to call obsFunctionThatGetsMeData(keys[index++]) and do the same logic as above. */
}
);
}
我知道将订阅放在订阅中是不好的做法,这只是我正在寻找的想法。我知道 takeWhile 在某个条件下有效,但是如果该条件失败,我不知道如何进行额外的调用。有谁知道哪种运算符最适合这种行为?
谢谢!
- obsFunctionThatGetsMeData 返回 Observable
解决了我自己的问题 使用递归和 switchmap
getResults(data: any[], index: number): Observable<any> {
return obsFunctionThatGetsMeData(keys[index]).pipe(
switchMap(result => {
if (result) {
data= data.concat(result);
if (data.length < NEEDED_NUM_DATA && index < keys.length) {
return getResults(data, ++index);
} else {
return Observable.of(data);
}
}
}));
}
【问题讨论】:
-
迭代器在哪里?具体来说,您将一个数组和单个键传递给
getResults,一个单个值。在obsFunciton...中,您重复使用单个值的相同模式。我确实看到了评论[index++] -
一旦 obsFunctionThatGetsMeData 的结果将至少 NEEDED_NUM_DATA 添加到数据中,我想停止对键的迭代。
-
知道了,你清楚地知道
NEEDED_NUM_DATA的值。请在下面查看我的答案。它使用 Promise 是因为它们是在这里使用的正确工具。
标签: javascript typescript rxjs observable