У меня есть Vue-приложение, которое работает с Vuex и Axios. В этом приложении у меня есть vuex-store, который обрабатывает API-вызовы, но проблема в том, что когда я вызываю действия хранилища, я не могу передать ответ в вызывающем. Все идеи, что я делаю неправильно?
Код звонка:
import { FETCH_PRODUCTS, ADD_PRODUCT } from './actions.type'
methods: {
sendNewProduct () {
this.$store
.dispatch(ADD_PRODUCT, this.newProductForm)
.then(() => {
console.log('This never gets called')
})
}
}
Vuex-магазин:
const actions = {
[ADD_PRODUCT] (context, credentials) {
return new Promise((resolve) => {
ApiService
.post('/Products/', {
Name: credentials.Name,
Description: credentials.Description,
Price: credentials.Price
})
.then(({ data }) => {
this.$store
.dispatch(FETCH_PRODUCTS)
resolve(data)
})
.catch(({ response }) => {
console.log(response)
context.commit(SET_ERROR, 'Error adding product')
})
})
}
}
const actions = {
[ADD_PRODUCT](context, credentials) {
return ApiService.post("/Products/", {
Name: credentials.Name,
Description: credentials.Description,
Price: credentials.Price
})
.then(({ data }) => {
this.$store.dispatch(FETCH_PRODUCTS);
return data;
})
.catch(({ response }) => {
console.log(response);
context.commit(SET_ERROR, "Error adding product");
throw new Error("Error adding product");
});
}
};
Я удалил new Promise(...)
потому что axios уже создает обещание. Если добавилось return data
в then
обратный вызов и бросок в catch
обратного вызова, чтобы позволить вызывающему апи получить данные/ошибки.
Обратите внимание, что обещание разрешается до завершения FETCH_PRODUCTS, чтобы убедиться, что действие также завершено, вы должны написать:
.then(({ data }) => {
return this.$store.dispatch(FETCH_PRODUCTS)
.then(() => data);
})