如何在 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();
})
你所说的是,如果 isConnected
是 true
,那么永远不会发出一个项目,因此这个 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
我有一个连接到远程服务的任务。当它未连接时 - 启动整个连接程序,如果已经连接 - 只需完成。为此,我写了这个方法 -
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();
})
你所说的是,如果 isConnected
是 true
,那么永远不会发出一个项目,因此这个 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