2016-05-11 56 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