Подписаться на вложенную наблюдаемую - PullRequest
0 голосов
/ 20 сентября 2018

Допустим, у меня есть функция в провайдере :

saveCar(car: Car) {
    return this.saveCarImages(car).subscribe(
      (data:any) => {
        if(data[0].seats){
          car=data[0];
      }
      return this.api.put(`/car/${car.id}`, car, {
        headers: {
          'Content-Type': 'application/json'
        }
      });
      }
    )
  }

И эта вспомогательная функция в провайдере должна быть выполнена до фактического автомобилясохраняется:

 saveCarImages(car: Car) {
    return Observable.create((observable) => {
      let fileSaver = this.injector.get(FileSaverProvider);
    let promisearr = [];
        promisearr.push(Observable.create((observable) => {
          fileSaver.uploadImage(car.helpImage.file).subscribe(
            (data: any) => {
              car.helpImageId = data.id;
              observable.complete(car);
            }
          )
        })
        )
            promisearr.push(Observable.create((observable) => {
              fileSaver.uploadImage(car.helpImage2.file).subscribe(
                (data: any) => {
                  car.helpImageId2 = data.id;
                  observable.complete(car);
                }
              )
              }));
    return Observable.forkJoin(promisearr);
    });
  }

И затем у меня есть этот код в файле TS компонента :

        this.provider.saveCar(this.car).subscribe(
            (response: any) => {
                if (response) {
                       //success
                }
            },
            (error: any) => {
                      //error
            }
        );

Но это не работает.Здесь я пытаюсь достичь подписки на this.api.put (car) из файла TS компонента, но сначала мне нужно загрузить образы автомобилей, поэтому this.api.put (car) вложен вsaveImages наблюдаемый.Как я могу подписаться на this.api.put (car) из файла TS компонента?

1 Ответ

0 голосов
/ 20 сентября 2018

Вам не нужно использовать Observable.create метод.Это довольно низкоуровневый способ создания Observables, который обычно не требуется использовать.

В частности, глядя на ваш код, вы можете посмотреть, работает ли эта версия вспомогательного метода

saveCarImages(car: Car) {
    const fileSaver = this.injector.get(FileSaverProvider);
    const obsArray = [];
    obsArray.push(fileSaver.uploadImage(car.helpImage.file).pipe(map(id => {
       car.helpImageId = id;
       return car;
    })));
    obsArray.push(fileSaver.uploadImage(car.helpImage2.file).pipe(map(id => {
       car.helpImageId2 = id;
       return car
    })));
    return forkJoin(obsArray);
  }

Тогда saveCar станет

saveCar(car: Car) {
   return this.saveCarImages(car).pipe(
     map(data => data[0]),
     switchMap(car => this.api.put(`/car/${car.id}`, car, {
        headers: {
          'Content-Type': 'application/json'
        }
      })
    )
  }

На этом этапе ваш компонент должен иметь возможность вызывать saveCar и подписаться на него.

...