如何在 flatMap 链中正确完成 Completable?

How to properly complete Completable inside flatMap chain?

我有一个连接到远程服务的任务。当它未连接时 - 启动整个连接程序,如果已经连接 - 只需完成。为此,我写了这个方法 -

public Completable execute() {
        return fptrService.isConnected()
            .flatMap(isConnected -> {
                if (isConnected) return Single.never();
                else return bluetoothService.isBluetoothAvailable();
            })
            .flatMap(isAvailable -> {
                if (isAvailable) return bluetoothService.isBluetoothActivated();
                else throw new BluetoothNotAvailableException();
            })
            .flatMap(isActivated -> {
                if (isActivated) return bluetoothService.searchForFptr();
                else throw new BluetoothNotActivatedException();
            })
            .flatMapCompletable(fptrService::connect);
    }

在第一种情况下,当服务未连接时 - 一切正常。但是如果在第一阶段 isConnected() returns TRUE 所有链停止并且 Completable 根本没有完成。我该怎么做才能在第一阶段强制完成?


    .flatMap(isConnected -> {
        if (isConnected) return Single.never();
        else return bluetoothService.isBluetoothAvailable();
    })  

你所说的是,如果 isConnectedtrue,那么永远不会发出一个项目,因此这个 observable 永远不会终止。

相反,您应该向下游传递 Single of false:


    .flatMap(isConnected -> {
        if (isConnected) return Single.just(Boolean.FALSE);
        else return bluetoothService.isBluetoothAvailable();
    })
    // Will continue stream if `isConnected` is true
    .filter(isConnected -> isConnected)
    // if `isConnected` is false, then downstream operators won't be executed