javascript - 如何等待 Subject.next
问题描述
假设我有这样的订阅:
mySubject$.subscribe(async inp => await complexFunction(inp))
假设这mySubject$
是我拥有的主题。我需要一种方法来做到这一点:
await mySubject$.next(inp)
这样我就可以等待complexFunction
完成。
我试图为此创建一个自定义的主题实现,但这似乎并不容易。也许我错过了一些想法,它实际上很简单。
我在这里有什么选择?
更新:
基于 rxjs API 应该接受 Promises 的想法,我尝试了下面的代码。它不起作用,所以再次,我没有想法。
function rigObservable<T>(observable: Observable<T>) {
let resolve;
return {
awaiter: new Promise<void>(res => resolve = res),
observable: observable.pipe(tap(() => resolve()))
};
}
fdescribe('test', () => {
it('should work', async () => {
const subject = new Subject<string>();
const wrapper = rigObservable(subject);
let testValue;
wrapper.observable.subscribe(inp => of(inp).pipe(delay(1000), tap(t => testValue = t)).toPromise());
subject.next('text');
await wrapper.awaiter;
expect(testValue).toEqual('text');
});
});
解决方案
我不确定你的意图,但也许这样的事情会起作用:
const source$ = mySubject$.pipe(
mergeMap(inp => complexFunction(inp))
);
source$.subscribe(
value => console.log('received value from complexFunction', value)
);
source$
是一个可观察的,将发出complexFunction()
每次发出的结果mySubject$
。
推荐阅读
- python - 无法在 anaconda 上安装 OpenCV
- amazon-ecs - Terraform 动态块
- ios - 在本机反应中裁剪多个图像
- java - 如何在另一个对象中添加一个对象?
- angular - 错误类型错误:spanEl.getBoundingClientRect 不是函数
- regex - 正则表达式的第一个数字应为 0(验证)
- angular - 用于发布请求的服务的 Angular 9 单元测试?
- javascript - Javascript react-native中的过滤对象
- javascript - 使用 ui-router 多次调用 AngualrJS 指令
- pipenv - 获取由 `pipenv update` 更新的软件包列表