ค้นหาเว็บไซต์

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);
  }
}