如何让uiSignal处理嵌套的异步调用?

时间:2018-07-12 11:59:03

标签: angular typescript rxjs

我正在组件中使用rxjs库,该库具有名为uiSignal的东西。我正在尝试使用它在订阅电话期间显示“正在加载”屏幕。在简单的订阅服务器上,这似乎可以正常工作,但是在有嵌套订阅的地方,它不等待嵌套调用返回。

这是一个例子:

Button payButton = findViewById(R.id.pay_bttn);
payButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        if (mPaymentSessionData.isPaymentReadyToCharge() && mPaymentSessionData.getPaymentResult() == PaymentResultListener.SUCCESS) {
            // Use the data to complete your charge - see below.
            mPaymentSession.completePayment(new PaymentCompletionProvider() {
                @Override
                public void completePayment(@NonNull PaymentSessionData data, @NonNull PaymentResultListener listener) {
                    Log.v(TAG, "Completing payment with data: " + data.toString());

                    // This is where you want to call your backend...
                    // In this case mark the payment as Successful
                    listener.onPaymentResult(PaymentResultListener.SUCCESS);
                }
            });
        }
    }
});

但是,加载页面仅显示“ DoSomething”订阅的上下文,而不会等待DoSomethingElse订阅返回。我也尝试将uiSignal添加到nestedMethod'DoSomethingElse'订阅上,但这也不起作用。

基本上我希望它显示直到嵌套方法完成。

2 个答案:

答案 0 :(得分:0)

尝试使用switchMap

this.Service.DoSomething(this.thing)
  .pipe(
    switchMap((res) => this.nestedMethod())
  )
  .uiSignal({ uiLabel: 'Loading', debugInfo: '' })
  .subscribe(thing => {});

nestedMethod() {
  return this.Service.DoSomethingElse(this.OtherThing);
}

从理论上讲,这应该使uiSignal位等待两个可观察对象完成。

答案 1 :(得分:0)

要解决此问题,我最终按照以下方法使用了Observable.forkJoin:https://netbasal.com/rxjs-six-operators-that-you-must-know-5ed3b6e238a0