2016-05-11 9 views
0

Wie funktioniert der Zip-Operator im Fall von zwei Observable? Für mich unterbricht es den anderen, wenn man fertig ist. Bei einer anderen als Leere wartet es darauf, dass jedes Observable abgeschlossen wird, und dann mit den Ergebnissen zurück.RxJava: Zip Operator Thread Interrupt-Fehler für void beobachtbar

Der Code ist

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; 
      } 
    ); 

I cloudinary Uploader bin mit().() Zerstören Bild zu löschen, ist es im Falle des Erfolgs Void zurückgibt sonst Ausnahme/Fehler.

Es führt sofort die Firebase-Abfrage und bei Erfolg, unterbricht die Bild löschen beobachtbar.

Ist dies das richtige Verhalten? Oder gibt es einen Fehler in meinem Code?

Antwort

1

Der Zip wird schnell ausgeführt, wenn eine der Eingabesequenzen kürzer als der Rest ist. Sie könnten stattdessen merge Quellen.

+0

Vielen Dank für Ihre Antwort. Das ist der Betreiber, nach dem ich suche. Haben Sie Vorschläge, wann Sie zip verwenden sollen und wann nicht? – Arka

+0

zip ist nützlich, wenn Daten zeilenweise kombiniert werden müssen, aber nicht als Fortsetzungsfunktion dienen. – akarnokd