angular - typescript observable utilizarea .expand


Mă încurc cu utilizarea corectă a operatorului .expand() al Observable în cazul meu. Căutarea nu oferă multe exemple.

Deci, încerc să rulez o metodă/observabilă în mod recursiv și să returnez un observabil ca rezultat. Arată puțin dezordonat, orice sfat despre cum să îl fac frumos este apreciat de asemenea :)

Cod relevant:

metodă:

 private itemsTmp:Item[] = [];
  findRecentItemsAround(radius_current?:number) {
    let radiusKm:number = radius_current? radius_current : 10;
    let radiusLimitKm:number = 50;
    this.itemsTmp = [];


    const result = Observable.create(observer => {
      this._getRecentLocalItems(radiusKm).subscribe((data) => {
        this.itemsTmp = data;
        console.log("Found items:" + this.itemsTmp.length + " radius: "+ radiusKm);
        radiusKm = radiusKm+10;

        if(this.itemsTmp.length < 1 && radiusKm <= radiusLimitKm) {
          return this.findRecentItemsAround(radiusKm);
        }
        else {
          observer.next(this.itemsTmp);
          observer.complete();
        }
      });
    });

    // result.expand(data => {
    //   console.log("In expand");
    // });

    return result;
  }

utilizare:

this.itemsServiceUtils.findRecentItemsAround().subscribe(data => {
  observer.next(data);
  observer.complete();
});

În starea actuală metoda nu rulează a doua oară. Dacă decomentez .expand - primesc o eroare result.expand nu este o funcție Vă rog să-mi dați un sfat pentru remediere/implementare corectă, deoarece se pare că înțeleg greșit ceva cu observabilele/fac o oarecare încurcătură :D

Răspuns #1

Iată o implementare mai curată:

 getRecentLocalItems(radiusKm: number) {
     return this._getRecentLocalItems(radiusKm).map(
         t=> { return { distance: radiusKm, results: t } };
     );
 }
 findRecentItemsAround(radiusKm:number, radiusLimitKm:number)  {
     return this.getRecentLocalItems(radiusKm).expand(t=> {
          if (t.distance > radiusLimitKm-radiusKm || t.results.length > 0)
              return Observable.empty();
          return this.getRecentLocalItems(t.distance + 10);
     })
     .filter(t=> t.results.length > 0 || t.distance > radiusLimitKm);
 }

Folosește astfel:

this.itemsServiceUtils.findRecentItemsAround(10).subscribe(data => {
   //data.distance...
   //data.results...
});