В конце концов, это работает нормально. Это не шаблон, а окончательный код.
Component.vue - asyncData ()
asyncData({store, route, router}) {
let data = {
ca: route.params.ca,
province: route.params.province,
locality: route.params.locality,
}
return store.dispatch('FETCH_MAP_COORDINATES_AND_PROPERTIES', data)
.catch(() => {
if (process.browser) {
router.push('/404')
}else{
console.log("beforeThrow1");
throw { url: '/404' };
}
})
}
Это мое действие FETCH_MAP_COORDINATES_AND_PROPERTIES
let FETCH_MAP_COORDINATES_AND_PROPERTIES = ({commit, dispatch, state}, data) => {
return new Promise((resolve, reject) => {
fetchMapCoordinatesV2(data, state.axios)
.then((result) => {
if (result.status !== 200) {
logger.error({
key: 'src.api.map.fetchMapCoordinates.then.badResponse',
data: result.data
})
reject(result)
}
logger.info({
key: 'src.api.map.fetchMapCoordinates.then',
})
result = result.data
let center = {
lat: result.location.data.geocode.data.lat,
lon: result.location.data.geocode.data.lon
}
let zoom = result.location.data.zoom
commit('SET_PROPERTY_MAP_CENTER', result.location.data.geocode.data )
commit('SET_PROPERTY_MAP_BOUNDS', result.location.data.geocode )
let default_coords = {
ne: {
lat: result.location.data.geocode.data.ne_lat,
lon: result.location.data.geocode.data.ne_lon,
},
nw: {
lat: result.location.data.geocode.data.nw_lat,
lon: result.location.data.geocode.data.nw_lon,
},
se: {
lat: result.location.data.geocode.data.se_lat,
lon: result.location.data.geocode.data.se_lon,
},
sw: {
lat: result.location.data.geocode.data.sw_lat,
lon: result.location.data.geocode.data.sw_lon,
}
}
fetchMapProperties(default_coords, state.axios)
.then((result) => {
logger.info({
key: 'store.actions.map.index.FETCH_MAP_PROPERTIES.then',
data: result.data
})
commit('SET_MAP_PROPERTIES', result.data)
resolve(result.data)
})
.catch((error) => {
logger.error({
key: 'src.api.map.fetchMapProperties.catch',
coords: default_coords,
data: error
})
reject(error)
})
})
.catch((error) => {
logger.error({
key: 'src.api.map.fetchMapCoordinatesV2.catch',
data: error
})
reject(error)
})
})
};
И вот два моих метода извлечения:
let fetchMapCoordinatesV2 = (data, axios) => {
let query = '';
if (data.ca) query = query + `/${data.ca}`
if (data.province) query = query + `/${data.province}`
if (data.locality) query = query + `/${data.locality}`
logger.info({
key: 'fetchMapCoordinatesV2',
query: query
})
return axios.get(`/locations${query}`)
}
let fetchMapProperties = (coords, axios) => {
return new Promise((resolve, reject) => {
axios.post(`/properties/map`, coords)
.then((result) => {
logger.info({
key: 'src.api.map.fetchMapProperties.then',
coords: coords
})
resolve(result)
})
.catch((error) => {
logger.error({
key: 'src.api.map.fetchMapProperties.catch',
coords: coords,
data: error.response
})
reject(error)
})
});
}
Теперь он прекрасно работает, если оба вызова завершаются успешно, он обрабатывается правильно, и если какой-либо вызов http не выполняется или получает код состояния, отличный от 200, он отображает /404.