Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript rxJs回调,可观测为异步_Javascript_Asynchronous_Rxjs_Reactive Programming - Fatal编程技术网

Javascript 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

我在rxjs流中有一个映射操作

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()
接收到一个承诺,但它仍然按照预期工作,您甚至不需要将其转换为可观察的