对来自observable的对象数组应用一些异步操作

时间:2017-06-13 20:40:40

标签: angular typescript rxjs observable reactive-programming

我对RxJS Observable有点困难。

以下设置:

我的对象有一个界面(只是为了让事情更清晰):

interface MyObject
{
    value: number;
    new_value?: number;
}

然后有一个小函数,它接受一个对象并返回一个observable,它会更新对象:

let updateObject = (object: MyObject) => {
    return Observable.create(observer => {
        setTimeout(() => {
            object.new_value = object.value * 5;
            observer.next(object);
            observer.complete();
        }, 1500);
    });
};

现在我有一个source observable,它返回一个对象数组(例如作为服务器的响应):

let observable = Observable.of<MyObject[]>([
    {value: 1},
    {value: 2},
    {value: 3}
]);

所以,现在我想用我的&#34; updateObject()&#34;来更新数组中的每个对象。方法,所以当我订阅observable时,我得到了这个结果:

// here the asyncOperation should be applied to the observable
observable.subscribe((objects: MyObject[]) => {
    // objects should be:
    // [
    //     {value: 1, new_value: 5},
    //     {value: 2, new_value: 10},
    //     {value: 3, new_value: 15}
    // ]
});

我认为有可能,当我嵌套许多可观察物时,连续并订阅它们,但我认为这很难看。我没有找到由RxJS库提供的可观察功能,所以我问你们,如果你能帮助我的话!

您对我有什么想法或解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

最容易使用Observable.forkJoin来等待所有内部Observable完成:

observable
  .concatMap((objects: MyObject[]) => {
    const observables = [];
    objects.forEach(obj => observables.push(updateObject(obj)));

    return Observable.forkJoin(observables);
  })
  .subscribe(...);

答案 1 :(得分:0)

Observable.merge(
  Observable.of({value: 1}),
  Observable.of({value: 2}),
  Observable.of({value: 3})
)
.timer(1500).map(obj => Object.assign(obj, {newValue: obj.value * 5}))