ยกเลิกการสมัครรับการเรียกไคลเอ็นต์ HTTP ใน OnDestroy hook ของ Angular Service

มีวิธียกเลิกการสมัครรับการโทร http จากบริการเชิงมุมบน Destroy hook หรือไม่

ป.ล. ฉันทราบถึงตัวดำเนินการ 'take' ของ rxjs หรือการยกเลิกการสมัครบริการจากส่วนประกอบเอง

    import { HttpClient } from "@angular/common/http";
import { Injectable, OnDestroy } from "@angular/core";

@Injectable()
export class SampleService implements OnDestroy {
  constructor(private httpClient: HttpClient) {}

  getSampleData() {
    return this.httpClient.get("https://jsonplaceholder.typicode.com/todos/1");
  }
  ngOnDestroy(): void {
    // automatically unsubscribe to service.
  }
}

person varunduttsharma7    schedule 28.04.2021    source แหล่งที่มา
comment
@ R.Richards ขอบคุณสำหรับลิงค์ แต่เมื่ออินสแตนซ์บริการถูกทำลายด้วยส่วนประกอบ เราสามารถเขียนตรรกะการล้างข้อมูลเพื่อตรวจสอบว่าจำเป็นต้องยกเลิกการสมัครรับการเรียก http หรือไม่   -  person varunduttsharma7    schedule 28.04.2021


คำตอบ (1)


บริการไม่มีวงจรการใช้งานที่ขับเคลื่อนด้วย UI ดังนั้นไม่ว่าคุณจะใช้ onDestroy มากเพียงใด ก็จะไม่มีวันถูกเรียก เว้นแต่คุณจะเรียกด้วยตนเอง

นั่นเป็นเหตุผลที่เรามีเครื่องมือ อ่าน API เช่น:

<div> {{ yourObservable$ | async | json }} </div>
@Component({...})
export class Component implements OnInit {
   yourObservable$: Observable<any>
   constructor(public yourService: TheService) {
       this.yourObservable$ = this.yourService.getSampleData()
   }
}

ไปป์ Async จะสังเกตเห็นการเปลี่ยนแปลงวงจรชีวิต การสมัครสมาชิก และการยกเลิกการสมัครโดยอัตโนมัติทุกครั้งที่ส่วนประกอบถูกลบออก

  • การสมัครสมาชิก (ซึ่งคุณสามารถเพิ่ม sybscriptions อื่น ๆ ได้โดยการโทร .add) และการเรียก onDestroy ของคอมโพเนนต์ของคุณ subscription.unsubscribe()

Subscription.unsubscribe คือสิ่งที่ท่อ async สร้างขึ้น และคุณยังสามารถใช้เองได้

person Some random IT boy    schedule 28.04.2021
comment
แต่เราเห็นว่าบริการเชิงมุมที่ไม่ใช่อินสแตนซ์เดียวจะเรียก ngOndestroy ของบริการนี้เมื่อคอมโพเนนต์ที่ให้อินสแตนซ์ถูกทำลาย ?? ฉันกำลังมองหาวิธีตรวจสอบว่ายังมีสมาชิกที่ยังใช้บริการ http call อยู่หรือไม่ - person varunduttsharma7; 28.04.2021
comment
โดยปกติแล้วเมื่อต้องรับมือกับเรื่องแบบนี้: มีกฎทองข้อหนึ่งที่ทำงานได้อย่างน่าอัศจรรย์และค่อนข้างจะเกี่ยวกับวิธีที่ภาษาโปรแกรม C จัดการมัน: หากคุณกำลังจะทำอาหารในครัว ให้ปล่อยไว้ตามที่คุณพบเมื่อคุณทำเสร็จแล้ว . ดังนั้น หากส่วนประกอบสมัครสมาชิก ส่วนประกอบนั้นก็ควรรับผิดชอบในการยกเลิกการสมัคร หากคุณเปิดการสมัครสมาชิกทิ้งไว้ หน่วยความจำจะรั่วไหลและสูญเสียประสิทธิภาพ (เนื่องจากเบราว์เซอร์จะยุ่งอยู่กับการรันโค้ดการสมัครสมาชิกที่ไม่มีประโยชน์) - person Some random IT boy; 29.04.2021
comment
หากคุณต้องการดำเนินการล้างข้อมูลในฝั่งบริการเมื่อส่วนประกอบถูกทำลาย คุณอาจเรียก service.onDestroy() จากส่วนประกอบ แต่ได้รับการเตือน; อินสแตนซ์บริการอาจถูกแชร์และหากคุณทำสิ่งที่เป็นอันตราย อาจทำให้สถานะของส่วนประกอบอื่นๆ เสียหายได้ ฉันขอแนะนำให้คุณยึดติดกับ async ไปป์ - person Some random IT boy; 29.04.2021