2016-05-11 25 views
0

zip操作符在两个Observable的情况下如何工作?对我来说,一旦完成就会打断另一个。除了无效之外,它等待每个观测值都完成,然后返回结果。RxJava:zip操作员线程中断错误,无法观察

的代码是

Observable<Void> deleteImageObservable = deleteImage(order.getPrescriptionUrl()) 
      .subscribeOn(Schedulers.io()); 

    // deltes order image 

    // Deletes order without image 
    Observable<Void> deleteOrderObservable = Observable.create(subscriber -> { 

     App.getFirebase().child(Constants.Path.ORDERS).child(order.getOrderPath()).removeValue((firebaseError, firebase) -> { 
      if (firebaseError != null) { 
       // on order delete failed 
       Timber.e(firebaseError.toException(), "Order delete failed on id ", order.getOrderId()); 
       subscriber.onError(firebaseError.toException()); 
      } else { 
       Timber.i("Order deleted, key: %s", order.getOrderPath()); 
       subscriber.onCompleted(); 
      } 

     }); 

    }); 

    return Observable.zip(
      deleteImageObservable, 
      deleteOrderObservable, (aVoid, aVoid2) -> { 
       return aVoid; 
      } 
    ); 

我使用cloudinary上传()。destroy()方法来删除图像,它的成功,否则异常/错误的情况下返回void。

它立即执行firebase查询并成功时,中断图像删除observable。

这是正确的行为吗?或者我的代码中有一个错误?

回答

1

如果其中一个输入序列比其他输入序列短,则Zip会急切地完成。您可以改为merge来源。

+0

谢谢你的回答。这是我正在寻找的运营商。你有什么建议什么时候使用拉链,什么时候不使用? – Arka

+0

当您有数据逐行组合时,zip非常有用,但不能用作延续手段。 – akarnokd