RxJava:如何返回null的正确类型

我正在开发一个使用Firebase,Kotlin和RxJava的应用程序。

基本上,我需要做的是使用Firebase中的Auth注册用户,如果用户选择了一张照片,上传照片,然后将用户从Firebase中保存到数据库中。

到现在为止,我有这个

RxFirebaseAuth.createUserWithEmailAndPassword(auth, email, password) .map { authResult -> user.uid = authResult.user.uid authResult.user.uid } .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Maybe.empty<UploadTask.TaskSnapshot>() } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .map { RxFirebaseDatabase .setValue(mFirebaseDatabase.getReference("user") .child(user.uid), user).subscribe() } .doOnComplete { appLocalDataStore.saveUser(user) } .toObservable() 

当用户选择一张照片时,它正常工作,但是当它没有被选中时,其他地图被忽略,因为我返回了Maybe.empty()。

我应该如何实现这个使用或不使用用户照片?

谢谢。

看看下面的构造:

  val temp = null Observable.just("some value") .flatMap { // Throw exception if temp is null if (temp != null) Observable.just(it) else Observable.error(Exception("")) } .onErrorReturnItem("") // return blank string if exception is thrown .flatMap { v -> Single.create<String>{ // do something it.onSuccess("Yepeee $v"); }.toObservable() } .subscribe({ System.out.println("Yes it worked: $it"); },{ System.out.println("Sorry: $it"); }) 

如果遇到null,则应该抛出一个错误,然后使用onErrorReturn{}onErrorReturnItem()运算符返回一个默认值,该值将传递给下一个运算符链,而不会跳到Observer onError

所以你的代码应该是这样的:

 RxFirebaseAuth.createUserWithEmailAndPassword(auth, email, password) .map { authResult -> user.uid = authResult.user.uid authResult.user.uid } .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Observable.error<Exception>(Exception("null value")) // Throw exception if imageUri is null } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .onErrorReturn { user.photoUrl = "" // assign blank url string if exception is thrown } .map { RxFirebaseDatabase .setValue(mFirebaseDatabase.getReference("user") .child(user.uid), user).subscribe() } .doOnComplete { appLocalDataStore.saveUser(user) } .toObservable() 

但是这个代码存在一个问题,那就是在onErrorReturn之前发生的任何异常都会产生一个空的uri,并导致我们不需要的进一步的链执行。 如果发生任何其他异常,则应调用Error。

为此我们需要创建一个自定义的Exception类,并在onErrorReturn捕获这个抛出的异常。 看看下面的代码片段:

 ... ... .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Observable.error<MyCustomException>(MyCustomException("null value")) // Throw exception if imageUri is null } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .onErrorReturn { if(it !is MyCustomException) throw it else user.photoUrl = "" // assign blank url string if exception is thrown } ... ... 

希望它有帮助。