首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何异步填充集合?

问如何异步填充集合?
EN

Stack Overflow用户
提问于 2017-07-26 18:51:29
回答 1查看 42关注 0票数 0

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

我们的目标是不再拥有这样的东西:

代码语言:javascript
复制
[{
    name: 'supermarket x',
    products: [1, 2]
}]

更像这样的东西:

代码语言:javascript
复制
[{
    name: 'supermarket x',
    products: [{
        id: 1,
        name: 'cacao'
    }, {
        id: 2,
        name: 'milk'
    }]
}]

我必须为此编写基本代码,但我无法实现在完成后用第二个流填充第一个流。

有什么想法吗?

我在这里留下了一个带有结构的JSBin,以便您可以更快地使用它

https://jsbin.com/nucutox/1/edit?js,console

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 20:08:26

因此,您有一个getSupermarkets()函数和一个getProduct(id)函数,前者返回一个流,该流发出多个超市对象,后者返回一个流,该流发出具有指定id的单个产品,然后完成。您希望将包含产品ids的超市流映射到包含“已解析”产品对象的超市流。我说对了吗?

这是我的解决方案:

代码语言:javascript
复制
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));

当新的超市对象到达时,我们首先将其产品ids数组映射到产品可见数组,即Array<Id> => Array<Observable<Product>>。然后,我们将该数组传递给combineLatest操作符,该操作符将等待,直到每个可见对象产生一个值并发出这些值的数组,即产品对象的数组。然后,我们生成一个新的超市对象,并将products设置为数组。我们希望保持原始的supermarket对象不变,这就是Object.assign的原因。

为了让它工作,我不得不稍微更新一下你的getProduct()实现:使用.of(product)操作符而不是.from(product),因为product是我们想要发出的一个普通对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45324800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档