【问题标题】:RxJS5 - wait for 2 http calls, then listen to socketRxJS5 - 等待 2 个 http 调用,然后监听套接字
【发布时间】:2017-01-27 20:41:46
【问题描述】:

我有一个场景

  1. 我需要调用 2 个 http 服务等待它们
  2. 调用一些方法
  3. 开始监听接下来会经常使用的套接字
  4. 每次socket流,调用其他方法

如果重要的话,我正在使用 Angular2。

我现在拥有的是独立的(并且可以工作)。

我想知道如何在所有一系列运算符中创建它以保证等待前 2 个调用而不必使用本地变量? - 如果这样做有意义的话......

我在做什么:

this.sub1 = Observable
    .forkJoin([http.get(/api1), http.get('/api2')])
        .subscribe(([api1ResData, api2ResData]) => {
            this.doSomething(api1ResData, api2ResData);
        });

this.sub2 = socket.get('api3')
    .subscribe(data => {
        this.doSomethingElse(api3ResData);
    });

【问题讨论】:

    标签: rxjs5


    【解决方案1】:

    如果this.doSomething(api1ResData, api2ResData)是一个返回Observable或Promise的异步函数,并且你想在下一个操作中使用该操作的结果,你可以使用switchMapmergeMap将结果输出到另一个observable,然后订阅它以执行套接字操作,例如:

    this.sub1 = Observable
    .forkJoin([http.get(/api1), http.get('/api2')])
    .switchMap(([api1ResData, api2ResData]) => {
        return this.doSomething(api1ResData, api2ResData)
    })
    .switchMap(doSomethingResult => {
        return socket.get('api3')
    })
    .subscribe(socketGetResult => {
        this.doSomethingElse(api3ResData);
    });
    

    如果this.doSomething(api1ResData, api2ResData) 同步返回另一个类型或为空,那么您可以只使用.do 运算符(如果您不需要doSomething 结果),或者.map,否则,如果您使用@ 987654330@ 导致socket.get(3)

    this.sub1 = Observable
    .forkJoin([http.get(/api1), http.get('/api2')])
    .do(([api1ResData, api2ResData]) => {
       this.doSomething(api1ResData, api2ResData)
    })
    .switchMap(([api1res, api2res]) => {
        return socket.get('api3')
    })
    .subscribe(socketGetResult => {
        this.doSomethingElse(api3ResData);
    });
    

    您仍然使用switchMap 进行socket.get() 操作,因为您需要映射到另一个可观察对象,并接收之前的forkJoin 结果,因为.do 运算符是在不更改当前可观察对象的情况下执行代码。

    查看switchMap official docs

    【讨论】:

    • 感谢您提供的信息。尝试异步版本时出现类型错误:'([api1ResData, api2ResData]: any[]) => void' 类型的参数不可分配给 '(value: any[], index: number) 类型的参数 = > 可观察输入'。类型“void”不可分配给类型“ObservableInput”。
    • 嗨,你能检查一下你是否设置了return 语句,如果是这样,你能告诉我2个switchMaps中的哪一个给你错误吗?另外,检查 socket.get 和 this.doSomething 是否返回了一个 promise 或 observable。在这里,尝试向这些函数的源指定它们返回的任何类型。
    • 感谢您的宝贵时间。问题是 this.doSomething 不返回 observable,它只是一个没有返回的普通方法。 (doSomethingElse 的情况相同)
    • 在这种情况下使用 de .do() 版本,因为它就像一个同步的未定义返回 ;) 实际上与 socket.get() 相同,也许你甚至可以在同一个 .do()如果您不需要以下订阅中的结果,则阻止
    • 我的错,我误解了你第一次说的话。这很有效,并且 rx 开始投入使用。感谢您的耐心等待!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2011-02-15
    • 1970-01-01
    • 2013-03-29
    • 2014-02-07
    • 2013-01-17
    • 2021-01-07
    相关资源
    最近更新 更多