تايب سكريبت - RXJS Observable افعل شيء عند الاكتمال


أود استخدام RXJS Observable. بشكل أساسي فهو يعمل بشكل جيد، لكنني لا أحتاج فقط إلى التفاعل عندما يتم استدعاء observer.next()، بل أيضاً عندما يتم استدعاء observer.complete(). كيف يمكنني الحصول على حدث OnComplete لـ RXJS Observable؟ في رأيي، وثائق RXJS مربكة.

export class Service {
    myMethod():Observable<any> {
        return Observable.create((observer:any) => {
        for(let i=0; i<10; i++) {
         observer.next(i);
        }
        if(true==true) {
            // this event I need
            observer.complete();
        } else {
            observer.error(xhr.response);
        }
    }
}

export class Component() {
    // constructor etc.

    doSome() {
        this.service.myMethod()
        // Here I would like to get OnComplete event
          .catch(this.handleError)
          .subscribe((num:any) => {
            console.log(num);
        });
    }
}

الإجابة رقم 1

تقبل طريقة الاشتراك ثلاث ردود نداء. الأخير منها مخصص لحدث الاكتمال.

doSome() {
  this.service.myMethod()
      .subscribe((num:any) => {
        console.log(num);
      }, (err) => {
        this.handleError(err);
      }, () => { // <----
        this.handleComplete();
      });
}

يمكنك أيضاً الاستفادة من عامل finally لهذا.

doSome() {
  this.service.myMethod()
      .catch(this.handleError)
      .finally(this.handleComplete) // <----
      .subscribe((num:any) => {
        console.log(num);
    });
}

ملاحظة: هناك فرق بين المثالين في حالة حدوث أخطاء: إذا قمنا بإضافة console.log لَرَأينا أن في الحالة الأولى يتم طباعة handleError فقط

-> handleError

في الحالة الثانية

-> handleError
-> finally

بعبارة أخرى، يتم استدعاء finally دائمًا، بينما لا يتم استدعاء complete.

الإجابة رقم 2

كما أجاب تييري تمبلييه، أحد الخيارات هو الاستفادة من finally/finalize (وثائق rxjs) (لكنها ليست مثل استخدام حدث complete، انظر الملاحظات)

الأخير

خيار آخر للقيام بشيء عند الاكتمال هو last (rxjs/last)