Javascript rxJs回调,可观测为异步
我在rxjs流中有一个映射操作Javascript rxJs回调,可观测为异步,javascript,asynchronous,rxjs,reactive-programming,Javascript,Asynchronous,Rxjs,Reactive Programming,我在rxjs流中有一个映射操作 streaming.map((data) => { //example async call methodCall.then((response) => { return data.test }) }) .filter((value) => ...); 问题是在data.test自然返回之前调用filter。所以我试着把它转换成switchMap并返回一个可观察的 streaming.switchMap((data) =&g
streaming.map((data) => {
//example async call
methodCall.then((response) => {
return data.test
})
})
.filter((value) => ...);
问题是在data.test自然返回之前调用filter。所以我试着把它转换成switchMap并返回一个可观察的
streaming.switchMap((data) => {
return Observable.create((observer) => {
//example async call
methodCall.then((response) => {
observer.next(data.test);
observer.complete();
});
});
})
.filter((value) => ......);
我假设在这种情况下,由于我们返回的是一个具有显式计时的observable,因此在调用next时,只会在调用Observator.complete之后调用filter,但在值变量未定义的情况下过早调用filter
我通常如何使用rxJs来实现这一点?通常,您可以使用
fromPromise
将Promise
转换为可观察的
streaming.switchMap((data) => Observable.fromPromise(methodCall))
.filter((value) => ...);
这做了所有难看的工作,你只是喜欢RxJS编程
可能在筛选
之前,您需要应用一些.map
来返回数据。测试
而不是数据我认为您缺少返回语句或其他内容。这就是为什么它会给你意想不到的结果。switchMap()
操作符订阅从其回调返回的可观察对象,并重新提交其所有项,直到返回另一个可观察对象。它不会等待完整的通知
这应该模拟您的示例:
function methodCall() {
return new Promise(resolve => setTimeout(() => {
resolve(123);
}, 1000));
}
Observable.of(42)
.do(value => console.log('start: ' + value))
.switchMap((data) => {
return Observable.create((observer) => {
//example async call
methodCall().then((response) => {
observer.next(response);
observer.complete();
});
});
})
.filter(value => true)
.subscribe(value => console.log('next: ' + value));
见现场演示:
请注意,123
在承诺解析时发出
顺便说一下,也许您根本不需要使用switchMap()
。RxJS 5以同样的方式处理可观察对象、承诺、数组、类似数组的对象等。这意味着您可以为上述任何一项交换可观测值。例如,您可以只使用concatMap()
,结果将是相同的:
function methodCall() {
return new Promise(resolve => setTimeout(() => {
resolve(123);
}, 1000));
}
Observable.of(42)
.do(value => console.log('start: ' + value))
.concatMap(value => methodCall())
.filter(value => true)
.subscribe(value => console.log('next: ' + value));
见现场演示:
请注意,concatMap()
接收到一个承诺,但它仍然按照预期工作,您甚至不需要将其转换为可观察的