Выражение [1, 2, 3, ...18]
недействительно.
Вы не можете использовать ...
с Number . Вы можете использовать только ...
с итерируемым объектом, например Array , String или Object .
Это интересно что Tracur - другой транспилятор - генерирует ошибку при подаче одного и того же кода:
TypeError: не может распространять неистребимый объект.
Я не интимный с спецификацией , но я думаю, что это может быть бабелем «ошибка».
Вы называете карту на наблюдаемой здесь this.store.select(s => s.settings).map((state: any)
. Вам нужно использовать pipe(map())
. В этой строке вы все делаете правильно: return this.http.put('route/' + id, { settings }).pipe(map((response: any)
Вы должны объединить несколько операторов в 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)
);
Вот псевдокод того, что вы можете попробовать:
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));
});
})
}