2017-07-27 82 views
1

我有一个连接远程服务的任务。当它没有连接时 - 启动整个连接程序,如果已连接 - 就完成了。为此我写了这种方法 -如何正确完成flatMap链中的Completable?

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()返回TRUE,所有链拖延并且Completable完全没有完成。我能做些什么来强制在第一阶段完成?

+0

尝试返回'Completable.complete()'而不是Single.never() –

+0

尝试......(但flatMap想回单,不完整 –

回答

0
 

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

什么你这个说的是,如果isConnectedtrue,则绝不会发出一个项目,因此该观察的永远不会终止。

相反,你应该下游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 
 
+0

此解决方案将导致chainNotAvailableException在链的第二步,这可能并非如此。我所需要的是在第一步完成Completable。我同意,Single.never()只是使完成等待永远...我认为这是没有“在连锁”的解决方案,我不得不重新调整查询... –

+0

@ЕвгенийКравцов,你不能终止observab你可以将你的observable过滤为isConnected状态,所以在那个操作符之后你可以确定这个异常不会被抛出。更新了答案。 – azizbekian