Angular - как получить состояние из ngrx и затем выполнить http

Выражение [1, 2, 3, ...18] недействительно.

Вы не можете использовать ... с Number . Вы можете использовать только ... с итерируемым объектом, например Array , String или Object .

Это интересно что Tracur - другой транспилятор - генерирует ошибку при подаче одного и того же кода:

TypeError: не может распространять неистребимый объект.

Я не интимный с спецификацией , но я думаю, что это может быть бабелем «ошибка».

1
задан duxfox-- 15 January 2019 в 15:58
поделиться

3 ответа

Вы называете карту на наблюдаемой здесь this.store.select(s => s.settings).map((state: any). Вам нужно использовать pipe(map()). В этой строке вы все делаете правильно: return this.http.put('route/' + id, { settings }).pipe(map((response: any)

0
ответ дан J. S. 15 January 2019 в 15:58
поделиться

Вы должны объединить несколько операторов в pipe. Используйте switchMap (или даже mergeMap), чтобы отобразить выходные данные вашего магазина в Observable из запроса Http, а затем выполнять свои другие задачи, каждый в своем собственном операторе. Таким образом вы получите намного более чистый код.

Это должно выглядеть примерно так:

updateSettings({ settings }) {
  return this.store.select(s => s.settings)
    .pipe(
      // map the state from your store to the http request
      switchMap((state: any) => this.http.put('route/' + state.data.id, { settings })),
      // map the http response to the data your care about
      map((response: any) => response.data),
      // execute any other task with that data
      tap(data => this.store.dispatch(new GetSettingsSuccess({ data }))),
      // catch errors if they occurr
      catchError(this.errorHandlerService.handleError),   
    );

Затем вы подписываетесь на возвращаемую Observable, и ваш http-запрос будет выполнен после того, как значение из хранилища будет отправлено.

this.settingService.updateSettings({ settings }).subscribe(
  // you'll have access to your data from the http response here
  data => doSomething(data) 
);
0
ответ дан fridoo 15 January 2019 в 15:58
поделиться

Вот псевдокод того, что вы можете попробовать:

 updateSettings({ settings }) {
   // use store select through a reducer:
    return this.store.select('your_reducer_here').subscribe( state => {
      //get id from your state  
      const id = state.data;

      //use that id in your http call
      return this.http.put('route/' + id, { settings }).pipe(map((response: any) => {
        const { data } = response;
        this.store.dispatch(new GetSettingsSuccess({ data }));
        return data;
      })).pipe(catchError(this.errorHandlerService.handleError));
    });
    })
}
0
ответ дан Aragorn 15 January 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: