Как я могу улучшить свой код потока с помощью условных выражений и циклов с помощью наблюдаемых RXJS в Angular? - PullRequest
0 голосов
/ 04 января 2019

Я новичок в RXJS Observables, и я пытаюсь улучшить следующий код, этот код хорошо работает, поэтому я написал этот код, думая о линейном программировании, но я думаю, что это не правильно, но кнопка вызова этой функции:

  submitLocations() {
    var locationsToAdd = this.locationsChecked.filter(item => !this.myLocations.some(other => item.id === other.id));
    var locationsToDelete = this.myLocations.filter(item => !this.locationsChecked.some(other => item.id === other.id));

    if (locationsToAdd.length > 0) {
      this.addLocations(this.createLocationsToEdit(locationsToAdd));
    }
    if (locationsToDelete.length > 0) {
      this.deleteLocations(this.createLocationsToEdit(locationsToDelete));
    }
    const startIndex = this.navCtrl.getActive().index - 1;
    this.navCtrl.remove(startIndex, 2).then(() => {
      this.events.publish('dniNameUpdated', true);
      this.navCtrl.pop().then(() => this.presentToast(`Se han actualizado tus localizaciones favoritas`))
    })
  }

private createLocationsToEdit(locations) {
    let locationsToEdit = {} as LocationLegacyEdit;
    locationsToEdit.locations = [];
    locations.forEach((res: LocationModel) => {
      locationsToEdit.locations.push(res.id);
    });
    return locationsToEdit;
  }

Как вы видите, в моем коде у меня есть 2 списка для добавления и удаления местоположений, если его длина превышает 0, я должен вызывать свои сервисы с помощью: addLocations и deleteLocations.

    private addLocations(locations: LocationLegacyEdit) {
    this._sp.addFavoriteLocationList(locations).subscribe(() => {
    }, error => console.log(error))
  }

  private deleteLocations(locations: LocationLegacyEdit) {
    this._sp.deleteLocationOteroUserList(locations).subscribe(() => {
    }, error => console.log(error))
  }

И мои услуги, которые возвращают наблюдаемые, таковы:

    deleteLocationOteroUserList(locations: LocationLegacyEdit): Observable<any> {
    let url = URL_SERCAE + '/instances/favorites-locations';
    return this.http.request('DELETE', url, {
      body: locations
    })
  }

  addFavoriteLocationList(locations: LocationLegacyEdit): Observable<any> {
    let url = URL_SERCAE + '/instances/favorites-locations';
    return this.http
      .post(url, locations)
      .map(res => {
        return res['result'];
      })
  }

Может кто-нибудь помочь мне, как я могу улучшить этот поток? Я не уверен, должен ли я написать 1 услугуобъединить ДОБАВИТЬ с УДАЛИТЬ или Должен ли я написать это в моем компоненте с условным продолжением, если длина равна 0.

Заранее спасибо

1 Ответ

0 голосов
/ 06 января 2019

При работе с RxJS рекомендуется переход к одностороннему потоку данных.Это будет означать, что у службы есть Observable, на который любой может подписаться, чтобы получить список местоположений (который будет выдаваться в любое время, когда происходит изменение).Кроме того, это будет означать, что функции добавления и удаления больше не будут возвращать наблюдаемое (поскольку любой, кому требуется обновленное значение, должен быть уже подписан на основное наблюдаемое).

class locationService {
    // This is a BehaviorSubject so the service can easily emit new values
    //  but outside of this service, all changes must happen by calling functions
    // so we will only expose an Observable 
    private locationSubject = new BehaviorSubject<Location[]>([])
    get locations$() {
        return locationSubject.asObservable();
    }

    addFavoriteLocation(location: Location) {
        this.http.post(...).subscribe(res=>{
            if(/*res indicates success*/) {
               this.locationSubject.next([...this.locationSubject.value, location])
            }
        })
    }
}
...