angular - RxJS Observables, ตรวจสอบแคชก่อนทำการร้องขอ API
ฉันกำลังสร้างแอป Angular และมีบริการ API วิธี get ของฉันจะทำการเรียก HTTP ก็ต่อเมื่อข้อมูลที่ขอไม่มีอยู่ในแคช ฉันกำลังใช้ไลบรารี LocalForage ที่ใช้ Promise และแปลงมันเป็น Observables
export class CacheService {
get(prop: string) {
return Observable.fromPromise(localForage.getItem(prop));
}
ตอนนี้ในการให้บริการ API ของฉัน ฉันกำลังใช้งาน cache และ http observables ของฉันแบบนี้:
export class ApiService {
get(uri: string) {
return Observable.race(
this.cache
.get(uri)
.filter(res => !!res),
this.http.get(uri)
);
}
}
เนื่องจาก Observable.race จะส่งกลับเฉพาะ observable ที่ปล่อยค่า ก่อน เท่านั้น ฉันคิดว่าตราบใดที่ฉันใช้ตัวดำเนินการ .filter() ทุกอย่างก็น่าจะทำงานได้ อย่างไรก็ตาม ไม่มีตัวใดส่งค่ากลับถ้าข้อมูลไม่ได้อยู่ในแคช ดังนั้นคำขอ HTTP จึงไม่เกิดขึ้นเลย หากใครสามารถชี้ข้อผิดพลาดของฉันหรือแนะนำวิธีแก้ปัญหาที่ดีกว่า ฉันยินดีรับฟังทุกคำแนะนำ
คำตอบ #1
ปัญหาคือ race จะเสร็จสิ้นทันทีที่ observable ตัวใดตัวหนึ่งเสร็จสิ้น การเรียกใช้งาน cache ของคุณไม่ได้ส่งค่า null แต่จะเสร็จสิ้นทันที คุณสามารถใช้ merge เพื่อดำเนินการต่อหลังการเสร็จสิ้น และ take(1) เพื่อพิจารณาผลลัพธ์ตัวแรกเท่านั้น:
export class ApiService {
get(uri: string) {
return Observable.merge(
this.cache
.get(uri)
.filter(res => !!res),
this.http.get(uri)
).take(1);
}
}
