typescript - Angular: ตัวแปรสมาชิกไม่กำหนดค่าในฟังก์ชัน
ฉันมีบริการดังต่อไปนี้ ซึ่งมีฟังก์ชันที่ส่งค่ากลับเป็น Observable เนื่องจากมันดึงข้อมูลจากบริการอื่น แปลงข้อมูลนั้น และจากนั้นส่งค่ากลับ (เป็น Observable)
@Injectable({
providedIn: 'root'
})
export class ReportColumnHeaderService {
constructor(private companyService: CompanyService) {}
public getColumnHeaderElements(variableDimensions: string[]): Observable<HeaderElement[]> {
return Observable.create(function(observer) {
this.companyService.getCompanies( (companies: Company[]) => {
let headerElements = getHeaderElements(companies);
observer.next(headerElements);
observer.complete();
});
});
}
}
ปัญหาคือ this.companyService เป็น undefined ภายใน function ผมอ่านมาว่ามันน่าจะเป็นไปได้ถ้าผมใช้ => แบบนั้น:
return Observable.create((observer) => {
this.companyService.getCompanies( (companies: Company[]) => {
let headerElements = let headerElements = getHeaderElements(companies);
observer.next(headerElements);
observer.complete();
});
});
แต่โค้ดนั้นคอมไพล์ไม่ได้ มันบอกว่า คาดหวัง 0 อาร์กิวเมนต์ แต่ได้ 1 อาร์กิวเมนต์ ใครสักคนช่วยให้คำใบ้วิธีแก้ปัญหานี้ได้ไหม?
คำตอบ #1
สมมติว่า getCompanies คืนค่า observable คุณกำลังพลาด subscribe ในฟังก์ชัน คำสั่งที่ถูกต้องมีดังนี้:
this.companyService.getCompanies().subscribe( (companies: Company[]) => {
คำตอบ #2
this.companyService.getCompanies( (companies: Company[]) => {
let headerElements = getHeaderElements(companies);
observer.next(headerElements);
observer.complete();
});
ถ้าคุณต้องการดึงข้อมูลจากบริการ คุณจำเป็นต้องใช้ subscribe วิธีที่ดีที่สุดคือสร้างค่าคงที่ของคุณในเมธอดหรือเป็นตัวแปรสาธารณะ ตัวอย่างเช่น
companies: Company[];
this.companyService.getCompanies.subscribe((res) => {
this.companies = res;
console.log(this.compmanies)
/** this is just simple exemple */
});
การสมัครรับข้อมูล Observables จำไว้ว่า observables มีลักษณะขี้เกียจ ถ้าคุณไม่สมัครรับข้อมูล จะไม่มีอะไรเกิดขึ้น การรู้ว่าเมื่อคุณสมัครรับข้อมูลกับ observer การเรียกใช้ subscribe() แต่ละครั้งจะกระตุ้นการทำงานอิสระของตัวมันเองสำหรับ observer นั้นๆ เป็นเรื่องที่ดี การเรียก subscribe จะไม่ถูกแชร์ระหว่างผู้สมัครหลายคนสำหรับ observable เดียวกัน https://medium.com/@luukgruijs/understanding-creating-and-subscribing-to-observables-in-angular-426dbf0b04a3
และแน่นอนว่าถ้าคุณสร้างการสมัครสมาชิก อย่าลืมยกเลิกการสมัครสมาชิก
