Asynchronous 如何异步填充集合?

Asynchronous 如何异步填充集合?,asynchronous,rxjs,Asynchronous,Rxjs,我试图通过异步方式向每个超市添加产品来填充超市集合 我们的目标是避免出现这样的情况: [{ name: 'supermarket x', products: [1, 2] }] [{ name: 'supermarket x', products: [{ id: 1, name: 'cacao' }, { id: 2, name: 'milk' }] }] 更像这样: [{

我试图通过异步方式向每个超市添加产品来填充超市集合

我们的目标是避免出现这样的情况:

[{
    name: 'supermarket x',
    products: [1, 2]
}]
[{
    name: 'supermarket x',
    products: [{
        id: 1,
        name: 'cacao'
    }, {
        id: 2,
        name: 'milk'
    }]
}]
更像这样:

[{
    name: 'supermarket x',
    products: [1, 2]
}]
[{
    name: 'supermarket x',
    products: [{
        id: 1,
        name: 'cacao'
    }, {
        id: 2,
        name: 'milk'
    }]
}]
我必须为此编写基本代码,但一旦完成,我无法用第二个流填充第一个流

有什么想法吗

我在这里留下了一个JSBin,它的结构可以让您更快


谢谢

因此,您有一个
getsupermarkes()
函数,它返回一个发出多个超市对象的流,还有一个
getProduct(id)
函数,它返回一个发出具有指定id的单个产品的流,然后完成。您希望将包含产品ID的超市流映射到包含“已解析”产品对象的超市流。我做对了吗

以下是我的解决方案:

const supermarkets$ = getSupermarkets()
    .concatMap(supermarket => {
        const productStreams = supermarket.products
            .map(productId => getProduct(productId));

        return Rx.Observable.combineLatest(productStreams)
            .map(products => Object.assign({}, supermarket, { products }));
    });

supermarkets$.subscribe(x => console.log(x));
当一个新的超市对象到达时,我们首先将其产品ID数组映射到一个可观察的产品数组,即
array=>array
。然后我们将该数组传递给一个
combinelateest
操作符,该操作符等待每个观察值产生一个值并发出这些值的数组,即产品对象的数组。然后我们生成一个新的超市对象,将
products
设置为数组。我们希望保持原来的
超市
对象不变,这就是
object.assign
的原因


为了使它正常工作,我必须稍微更新您的
getProduct()
:使用
.of(product)
操作符而不是
。from(product)
,因为
product
是我们想要发出的普通对象。

您能澄清一点吗:应该
getsupermarkes()
返回一个流,该流发出一个值,该值是一个超级市场数组,还是该流发出多个值,每个值都是一个超级市场对象?它应该发出一个流,确切地说,该流发出多个值。对不起,没有详细说明。