【问题标题】:rxjs Observable merge doesn't work as expectedrxjs Observable 合并没有按预期工作
【发布时间】:2018-07-04 12:22:31
【问题描述】:

我需要为 POST 请求生成此结果:

{
"names": [
    {
        "id": "t3xcb9xAyX",
        "username": "Gennaro"
    },
    {
        "id": "Csdu65RKon",
        "username": "Marco"
    },
    ...
],
"createdAt":"04/07/2018 - 11.49.51"
}

所以我使用 rxjs 完成了这项工作:我创建了两个 Observable(一个用于名称,一个用于 createdAt)并在最后合并:

const notObj = utils.getNotificationType(codeProduct, Parse);
const csvObj = utils.getNotificationType(codeProduct, Parse);

const query = new Parse.Query(notObj);
const dateQuery = new Parse.Query(csvObj).descending('createdAt');


const names = from(query.find())
    .map(el => el.map((e) => {
        return {
            id: e.id,
            username: e.get('username')
        }
    }))
    .mergeMap((arr) => Observable.of({
        names: arr
    }));

const lastUpdate = from(dateQuery.first())
    .map(res => moment(res.createdAt).format('DD/MM/YYYY - HH:mm:ss'))
    .map(res => {
        return {
            createdAt: res
        }
    });


merge(names, lastUpdate)
    .subscribe(
        (data) => res.send(serialize(data)),
        (error) => res.send(serialize(error)),
        () => console.log('complete')
    );

问题是最终合并只检索我"names"。我可以使用 .zip() 运算符得到另一个结果,但我有一个 JSON 数组而不是一个对象。

我的问题是:为什么merge() 不合并两个结果而只合并第一个?谢谢

【问题讨论】:

    标签: javascript rxjs observable rxjs5


    【解决方案1】:

    merge 不是这样做的。它合并 Observable 流而不是对象本身。改用forkJoin,它将发出一个结果数组,然后自己将其与map合并:

    const names$ = ...;
    const lastUpdate$ = ...;
    
    forkJoin(names$, lastUpdate$)
      .map(([ names, lastUpdate ]) => ({ names, lastUpdate }))
      .subscribe(...)
    

    【讨论】:

    • forkJoin() 和 zip() 有什么区别?我试过了,它们很相似
    • forkJoin 存储每个源 Observable 的最后一个值,并在所有源 Observable 完成时发出一个包含所有源 Observable 的最后一个值的数组。 zip 每次所有源 Observable 发出 N 值时都会发出(例如,当你有 2 个 Observable 并且第一个发出 4 个 valeus 而第二个只有 2 个两个值时,zip 将发出两个数组,第一个和第二个每个源 Observable 的值)。
    猜你喜欢
    • 2018-09-12
    • 2017-03-14
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2021-03-16
    相关资源
    最近更新 更多