เลิกใช้การสมัครใช้บริการแล้ว: ใช้ผู้สังเกตการณ์แทนการติดต่อกลับข้อผิดพลาด


94

เมื่อฉันเรียกใช้ linter มันจะบอกว่า:

subscribe is deprecated: Use an observer instead of an error callback

รหัส (จากแอพ angular 7 พร้อม angular-cli):

    this.userService.updateUser(data).pipe(
       tap(() => {bla bla bla})
    ).subscribe(
       this.handleUpdateResponse.bind(this),
       this.handleError.bind(this)
    );

ไม่ทราบแน่ชัดว่าควรใช้อย่างไรและอย่างไร ...

ขอบคุณ!


1
* ดังนั้นลองใช้.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos

ฉันไม่สามารถจัดการให้มันใช้งานได้โดยใช้ apiRest ของฉัน
Javier

คำตอบ:


134

subscribeไม่ได้เลิกใช้งานมีเพียงเวอร์ชันที่คุณใช้เท่านั้นที่เลิกใช้งานแล้ว ในอนาคตsubscribeจะใช้อาร์กิวเมนต์เดียว: nextตัวจัดการ (ฟังก์ชัน) หรืออ็อบเจกต์ผู้สังเกตการณ์

ดังนั้นในกรณีของคุณคุณควรใช้:

.subscribe({
   next: this.handleUpdateResponse.bind(this),
   error: this.handleError.bind(this)
});

ดูปัญหา GitHub เหล่านี้:


6
idk ... การโฉบใน vs code ยังคงแสดงว่าเลิกใช้กับไวยากรณ์นั้น (rxjs 6.5.3)
Yannic Hamann

6
เฮ้ @YannicHamann ความคิดเห็นนี้อธิบายว่าทำไม ยังไม่เลิกใช้งานพวกเขาเพิ่งเลิกใช้งานโอเวอร์โหลดอย่างใดอย่างหนึ่งและตอนนี้ดูเหมือนทุกอย่างจะเลิกใช้แล้ว เป็นปัญหาในการใช้เครื่องมือเป็นส่วนใหญ่
คณบดี

ฉันคิดว่าคำตอบนี้ใช้ไม่ได้อีกต่อไปเนื่องจากวิธีการสมัครสมาชิกทั้งหมดถูกเลิกใช้แล้วใน rxjs 6.5.4
Alok Rajasukumaran

39

อาจจะน่าสนใจที่จะทราบว่าobserverObject ยังสามารถ (ยัง) มีcomplete()method และคุณสมบัติเพิ่มเติมอื่น ๆ ตัวอย่าง:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

วิธีนี้จะง่ายกว่ามากที่จะละเว้นวิธีการบางอย่าง ด้วยลายเซ็นเก่าจำเป็นต้องจัดหาundefinedและยึดตามลำดับของข้อโต้แย้ง ตอนนี้ชัดเจนขึ้นมากเมื่อจัดหาเฉพาะตัวจัดการถัดไปและสมบูรณ์


10

คุณจะได้รับข้อผิดพลาดนี้ถ้าคุณมีวัตถุพิมพ์เป็นObservable<T> | Observable<T2>- Observable<T|T2>เมื่อเทียบกับ

ตัวอย่างเช่น:

    const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');

คอมไพเลอร์จะไม่ทำให้ประเภทobsObservable<number | string>

อาจทำให้คุณประหลาดใจที่สิ่งต่อไปนี้จะทำให้คุณเกิดข้อผิดพลาดUse an observer instead of a complete callbackและExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

เป็นเพราะอาจเป็นหนึ่งในสองประเภทที่แตกต่างกันและคอมไพเลอร์ไม่ฉลาดพอที่จะกระทบยอดพวกเขา

คุณจำเป็นต้องเปลี่ยนรหัสของคุณจะกลับมาแทนObservable<number | string> Observable<number> | Observable<string>รายละเอียดปลีกย่อยของสิ่งนี้จะแตกต่างกันไปขึ้นอยู่กับสิ่งที่คุณทำ


2

ฉันได้รับคำเตือนเพราะฉันส่งผ่านสิ่งนี้เพื่อสมัคร:

myObs.subscribe(() => someFunction());

เนื่องจากส่งคืนค่าเดียวจึงเข้ากันไม่ได้กับsubscribeลายเซ็นฟังก์ชันของ

การเปลี่ยนไปใช้สิ่งนี้ทำให้คำเตือนหายไป (คืนค่าว่าง / โมฆะ);

myObs.subscribe(() => {
  someFunction();
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.