在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
并返回一个可观察对象,但调用者则必须进行两次订阅。
答案 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,它将保留源排放的顺序。