使用RxJ执行顺序api调用?

时间:2016-06-04 09:53:32

标签: rxjs

在RxJs中是否有办法执行两个api调用,其中第二个需要来自第一个的数据并将组合结果作为流返回?我尝试做的是调用facebook API来获取各种大小的组列表和封面图像。 Facebook返回的内容如下:

// call to facebook /1234 to get the group 1234, cover object has an
// image in it, but only one size
{ id: '1234', cover: { id: '9999' } }

// call to facebook /9999 to get the image 9999 with an array
// with multiple sizes, omitted for simplicity
{ images: [ <image1>, <image2>, ... ] }

// desired result:
{ id: '1234', images: [ <image1>, <image2>, ... ] }

所以我有这个:

var result = undefined;
rxGroup = fbService.observe('/1234');
rxGroup.subscribe(group => {
  rxImage = fbService.observe(`/${group.cover.id}`);
  rxImage.subscribe(images => {
    group.images = y;
    result = group;
  }
}

我想创建一个接受组ID的方法,并返回一个Observable,它将在流中包含组合的组+图像(此处为结果)。我知道我可以创建自己的observable并调用next()函数,在那里设置&#39;结果&#39;以上,但我认为必须有一个方法来做到这一点。 select/map让我改变,但我不知道如何从另一个电话中获得结果。 when/and/then看起来很有希望,但看起来它并不支持这样的东西。我可以map并返回一个可观察对象,但调用者则必须进行两次订阅。

2 个答案:

答案 0 :(得分:3)

看起来像flatMap(fiddle)。它被称为subscribe,并为您提供流中的值。从中返回一个observable,它将所有创建的observable(一个用于基本流中的每个元素)的值输出到结果流中。

var sourceGroup = { // result of calling api /1234
  id: '1234',
  cover: {
    id: '9999'
  }
};
var sourceCover = { // result of calling api /9999
  id: '9999',
  images: [{
    src: 'image1x80.png'
  }, {
    src: 'image1x320.png'
  }]
};

var rxGroup = Rx.Observable.just(sourceGroup);
var rxCombined = rxGroup.flatMap(group =>
  Rx.Observable.just(sourceCover)
  .map(images => ({
    id: group.id,
    images: images.images
  }))
)

rxCombined.subscribe(x =>
  console.log(JSON.stringify(x, null, 2)));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.min.js"></script>

<强> 结果

{
  "id": "1234",
  "images": [
    {
      "src": "image1x80.png"
    },
    {
      "src": "image1x320.png"
    }
  ]
}

答案 1 :(得分:0)

您应该使用concatMap而不是flatMap,它将保留源排放的顺序。