Угловой.Получить значение из подписки внутри switchMap - PullRequest
0 голосов
/ 24 октября 2018

У меня есть форма для редактирования профиля пользователя.Если пользователь загружает фотографию, мне нужно загрузить ее в бэкэнд, получить имя изображения в ответе (например, timestamp_name.jpg) и сохранить это имя с другими предоставленными свойствами, такими как имя, адрес электронной почты и так далее.В эффекте магазина я попытался сделать это следующим образом:

@Effect()
  profileUpdated$ = this.actions$.pipe(
    ofType<ProfileUpdated>(UserActionTypes.ProfileUpdated),
    map(action => action.payload),
    switchMap(payload => {
      if (!!payload.picture) {
        this.uploadResource.image(payload.picture.files[0]).subscribe((res) => payload.picture = res);
      }
      return this.userResource.updateMyself({user: payload});
    }),
  );

Но изображение свойства не изменилось, потому что оно внутри подписки.Есть ли другое решение для достижения этой цели?

1 Ответ

0 голосов
/ 24 октября 2018

Вы правильно обнаружили, что subscribe является проблемой.subscribe никогда не должно появляться в операторе.Только конечный потребитель profileUpdated$ должен подписаться.Ниже приведена модифицированная версия вашего кода:

profileUpdated$ = this.actions$.pipe(
    ofType<ProfileUpdated>(UserActionTypes.ProfileUpdated),
    map(action => action.payload),
   // Upload image if needed
    switchMap(payload => {
      if (!!payload.picture) {
        return this.uploadResource.image(payload.picture.files[0]).pipe(
          map(res => {
             payload.picture = res;
             return payload;
          })
        );
      } else {
        // A switchMap operator must always return an Observable,
        // so in the case where no image needs to be uploaded
        // we simply return the original payload as an Observable.
        return of(payload);
      }
    }),
    // Update profile information
    switchMap(payload => this.userResource.updateMyself({user: payload}))
  );
...