#javascript #post #promise #axios
#javascript #Публикация #обещаю #axios
Вопрос:
Мне нужно сделать 5 post-запросов, и каждый post зависит от идентификатора предыдущего post-запроса.
endpoint4 зависит от идентификатора endpoint5
endpoint3 зависит от идентификатора endpoint4
endpoint2 зависит от идентификатора endpoint3
endpoint1 зависит от идентификатора endpoint2
Код, который я вам показываю, работает, но он слишком медленный, выполнение запроса за запросом занимает 4 минуты, чтобы выполнить полную публикацию формы. Есть какой-нибудь лучший способ сделать это?
const data = await this.$axios
.post('/endpoint1', {
attr: form.somedata,
})
.then((res) => {
return this.$axios.post('endpoint2', {
attr_id: res.data.id,
attr2: form.somedata,
})
})
.then((res) => {
console.log('segundo then res', res)
return this.$axios.post('/endpoint3', {
attr_id: res.data.id,
attr2: somedata,
})
})
.then((res) => {
return this.$axios.post('/endpoint4', {
attr_id: res.data.id,
attr2: somedata,
attr3: somedata2,
attr4: somedata3,
attr5: somedata4,
})
})
.then((res) => {
return this.$axios.post('/endpoint5', {
institution: {
attr_id: res.data.id,
attr2: somedata,
attr3: somedata2,
attr4: somedata3,
},
attr_5: somedata4,
})
})
Комментарии:
1. Вы определенно могли бы отформатировать это лучше (поскольку вы используете
await
, вам больше не нужноthen
. Тем не менее, я не знаю, как вы можете ускорить это, кроме как с меньшим количеством запросов (если ваш серверный сервер может консолидировать часть этой логики). Ничто из того, что вы делаете в своем коде, даже близко не приблизится к времени задержки в сети для пяти последовательных запросов.
Ответ №1:
Если вам нужно дождаться результата запроса, то вам нужно дождаться результата запроса, на самом деле нет никакого способа обойти это.
Если у вас есть контроль над серверной частью, я бы посоветовал проверить, есть ли там что-нибудь, что вы могли бы реорганизовать (возможно, объединить несколько конечных точек в 1), но кроме этого я больше ничего не могу сделать с предоставленной информацией.
Ответ №2:
GraphQL
разработан как решение такой проблемы, чтобы получить все данные в одном запросе.
Ответ №3:
Вы можете написать функцию, чтобы разделить проблемы и ответственность.
const BASE_URL = "base url of your server";
const resolve = async (url, options) => {
const data = await axios.post(`${BASE_URL}${url}`, options)
return await data.json() //if response will be in json format
}
И используйте комбинацию функции разрешения и async-await для разрешения результата синхронным способом
const flow = async () => {
// we destructured result and renamed it to "id1"
const { id: id1 } = await resolve('/endpoint1', {
attr: form.somedata,
});
const { id: id2 } = await resolve('/endpoint2', {
attr_id: id1,
attr2: form.somedata,
});
const { id: id3 } = await resovle('/endpoint3', {
attr_id: id2,
attr2: somedata,
})
const { id: id4 } = await resovle('/endpoint4', {
attr_id: id3,
attr2: somedata,
attr3: somedata2,
attr4: somedata3,
attr5: somedata4,
})
const result = await resovle('/endpoint4', {
institution: {
attr_id: id4,
attr2: somedata,
attr3: somedata2,
attr4: somedata3,
},
attr_5: somedata4,
})
return resu<
}