【发布时间】:2021-08-11 14:12:30
【问题描述】:
我有与这个例子类似的控制流的代码(显然,下面的谓词不需要是async,但它是一个例子):
const items [1,2,3,4,5];
const predicate = async (i) => i < 3;
const pipeline = from(items).pipe(
takeUntil(predicate),
);
pipeline.subscribe(console.log);
但这会引发 TypeError 消息“您可以提供 Observable、Promise、ReadableStream、Array、AsyncIterable 或 Iterable。”
我尝试过让predicate 成为一个承诺(new Promise(...),并使用takeWhile 代替takeUntil,但都没有按预期工作(承诺总是返回真实 - 我假设它被强制为真实). 这是我对 takeUntil/takeWhile 工作方式的某种误解吗?
作为一种解决方法,我目前正在使用这个:
const takeWhileAsync = (predicate = tautology) => {
const resultSymbol = Symbol('predicateResult');
const valueSymbol = Symbol('value');
const predicateResolver = item => of(item).pipe(
concatMap(async (i) => {
const predicateResult = await predicate(i);
return {[resultSymbol]: predicateResult, [valueSymbol]: i};
}),
);
return pipe(
concatMap(predicateResolver),
takeWhile(({[resultSymbol]: predicateResult}) => predicateResult),
pluck(valueSymbol),
);
};
【问题讨论】:
-
takeUntil不接受每个发出的项目都要调用的谓词,它接受一个“通知器”,一个在停止时发出的可观察对象。 -
@jonrsharpe 有没有一种方法可以提前从管道中退出,而无需创建可观察的通知程序?理想情况下,我想传入一个谓词(与
takeWhile一样),但该谓词是一个异步函数(takeWhile似乎总是强制为真值) -
一个异步函数应该更正为一个返回承诺的函数,对不起
-
据我所知不是这样;正如您所看到的,
takeWhile需要一个返回布尔值的谓词,而不是一个诺言(这确实是真的)。
标签: javascript rxjs