代码之家  ›  专栏  ›  技术社区  ›  Devrath

如何在RxJava中使用CONCAT运算符使用变量from first将其传递给second observate

  •  0
  • Devrath  · 技术社区  · 6 年前

    我最近学会了使用merge,在这里我将4个API请求合并为一个输出。( Reference : https://stackoverflow.com/q/51262421/1083093 )

    /************/
        @GET("app/dashboard")
        Observable<CategoryHomeModel[]> getCategories(@HeaderMap Map<String, String> headers);
    
        @GET("app/wallet/balance")
        Observable<WalletBalance> getWalletBalance(@HeaderMap Map<String, String> headers);
    
        @GET("/app/swap/myrateswaps")
        Observable<SwapSettings> rateMySwap(@HeaderMap Map<String, String> headers);
    
        @GET("/app/getsettings")
        Observable<Settings> getSettings(@HeaderMap Map<String, String> headers);
        /************/
    

    我有四个观察点

    Observable<CategoryHomeModel[]> categoriesObservable = retrofit
                .create(Restapi.class)
                .getCategories(prepareHeaders())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());
    
        Observable<WalletBalance> walletObservable = retrofit
                .create(Restapi.class)
                .getWalletBalance(prepareHeaders())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());
    
        Observable<Settings> settingsObservable = retrofit
                .create(Restapi.class)
                .getSettings(prepareHeaders())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());
    
        Observable<SwapSettings> ratingsObservable = retrofit
                .create(Restapi.class)
                .rateMySwap(prepareHeaders())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());
    

    Answer


    扩展上述问题:

    • 我有一个类似的问题:我怎样才能等到第一次被观察到 完全移动到第二到第三到第四。因为我用的是 从第一个可观测到的传递到第二个的变量 直到第四次观测

    我想我搜索的是一个很好的方法来实现这一点。

    1 回复  |  直到 6 年前
        1
  •  0
  •   tpaczesny    6 年前

    你需要的是 FLATMAP

    参考最初的可观察问题示例,代码可能如下所示(假设lamda语法与Java 8/RetroLambda中的语法相同):

    categoriesObservable.flatMap(categoryHomeModel -> {
            /* Work on categoryHomeModel result; you can use it to configure next request */
            return walletObservable.flatMap(walletBalance -> {
                /* Work on walletBalance result; you can use it to configure next request */
                return settingsObservable.flatMap(settings -> {
                    /* Work on settings result; you can use it to configure next request */
                    return ratingsObservable;
                });
            });
        }).subscribe(swapSettings -> { /* Work on swapSettings; sequence is done */ });
    

    这将确保您的请求按顺序执行。即使使用CONCAT,结果也将按顺序发送给订阅服务器,但是 实际请求可以并行启动 ,这有时是预料不到的。如果您有真正独立的请求(例如查询不同类型的数据),那么CONCAT/ZIP是一个不错的选择,如果实际HTTP请求的顺序无关紧要,那么并行运行请求是可以的(甚至是可取的)。