RxJS - 如何使用带有异步可观察数组的toArray()?

时间:2016-02-19 03:55:35

标签: reactive-programming rxjs

我正在使用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作为其他异步操作的替身,以保持示例简单。

1 个答案:

答案 0 :(得分:7)

除非您没有完成源可观察量,否则代码是正确的。

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()似乎在这里错了。此代码中不需要使源可观察源变热。