【问题标题】:RxJS - How to use toArray() with an array of asynchronous observables?RxJS - 如何将 toArray() 与异步 observables 数组一起使用?
【发布时间】:2016-02-19 03:55:34
【问题描述】:

我正在使用Rx.Observable.create() 创建一个异步可观察对象数组,并希望在它们完成时使用.toArray() 来获取所有值。

console.log('running');
let valsArray = ['a','b','c'].map((val,i)=>{
  return Rx.Observable.create((obs)=>{
    let tid = setTimeout(()=>{
      console.log(val + ' timing out');
      obs.onNext(val);
    },i*500);
    return ()=>{
      clearTimeout(tid);
    };
  }).publish().refCount();
});

Rx.Observable.from(valsArray)
.flatMap((v)=>v)
.toArray()
.subscribe((arr)=>{
  console.log("arr should be ['a','b','c']",arr);
});

http://jsbin.com/wegoha/10/edit?js,console 上的示例。

使用setTimeout 作为其他异步操作的替代,以保持示例简单。

【问题讨论】:

  • 您不应链接到外部网站,除非它支持您问题中已有的信息。

标签: reactive-programming rxjs


【解决方案1】:

代码是正确的,只是你没有完成源 observables。

toArray() 运算符只能在 observable 完成时工作,并且由于您没有完成 Rx.Observable.create,那么您的查询将永远不会结束。

试试这个:

console.log('running');
let valsArray = ['a','b','c'].map((val,i)=>{
  return Rx.Observable.create((obs)=>{
    let tid = setTimeout(()=>{
      console.log(val + ' timing out');
      obs.onNext(val);
      obs.onCompleted();
    },i*500);
    return ()=>{
      clearTimeout(tid);
    };
  }).publish().refCount();
});

Rx.Observable.from(valsArray)
.flatMap((v)=>v)
.toArray()
.subscribe((arr)=>{
  console.log("arr should be ['a','b','c']",arr);
});

另外,作为旁注,.publish().refCount() 在这里似乎是错误的。这段代码不需要让源 observables 变热。

【讨论】:

  • 谢谢。像魅力一样工作,现在我更好地理解了 onCompleted 方法。还检查了 hot and cold observables docs,因为我没有完全理解它们。 stackoverflow.com/questions/32190445/… 的精彩描述
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 2020-09-22
  • 1970-01-01
  • 2018-04-16
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多