axios 调用后数组索引的问题
Problem with array index after axios call
我正在使用 vue js 和 axios。
这是我正在尝试做的事情:
我的“大纲”数组通常包含 3 到 9 个条目。我想在每个条目上 运行 一个 axios 请求(运行SecondFunction()),但一次只有 运行 1 个请求(等待每条记录被获取,然后再启动另一个记录请求,而不是一次全部。如果其中一个请求失败,则会显示一条错误消息。现在,它可以正常工作,但是一些请求先于其他请求完成,并且我的索引位置在响应中是错误的。
method1(){
for (const [index, value] of this.splitOutlines.entries()) {
this.runSecondFunction(value, index);
}
}
runSecondFunction(value, index){
let formData = {
title: this.blog.value,
subheading: value
};
axios.post('/dashboard/paragraphs', formData).then((response) => {
this.articles.push({
index: index,
subheading: response.data.subheading,
paragraph: response.data.data.ideas[0],
});
}).catch(error => {
//
});
}
知道怎么做吗?
谢谢
一种方法是在出现错误时将错误对象推入数组。
axios.post('/dashboard/paragraphs', formData).then((response) => {
this.articles.push({
index: index,
subheading: response.data.subheading,
paragraph: response.data.data.ideas[0],
});
}).catch(error => {
this.articles.push({ error });
});
或者您可以将文章更改为普通对象而不是数组,并分配给对象的属性而不是推送。
axios.post('/dashboard/paragraphs', formData).then((response) => {
this.articles[index] = {
index: index,
subheading: response.data.subheading,
paragraph: response.data.data.ideas[0],
}
}).catch(error => {
如果您真的坚持这些而不是 运行 同时进行,那么您将不得不做以下两件事之一。你可以让 method1
调用一个 async
函数并在它周围抛出一个 try catch,同时组成一个新数组并 returning 或在其他地方设置它。例如
method1(){
(async function () {
const requests = []
for (const [index, value] of this.splitOutlines.entries()) {
try {
const res = await this.runSecondFunction(value, index);
requests.push(res)
} catch (e) {
requests.push(e)
}
}
return requests
)().then(reqs => {
// do other stuff with the completed requests.
})
}
这应该保证请求的顺序得到遵守,并且一次只有一个 运行。
否则,您将不得不在 .then
方法中执行某种递归实现。
编辑::
我忘了在你的 runSecondFunction
方法中提到,你需要 return 承诺,所以它应该是这样的:
runSecondFunction(value, index){
let formData = {
title: this.blog.value,
subheading: value
};
return axios.post('/dashboard/paragraphs', formData)
}
这样,mehtod1
中的 await
会将文章分配给我所谓的 res
(当然,您可以根据需要以任何方式操作此数据)。
但如果您希望它们出现在数组中,请不要处理 runSecondFunction
内的错误。
我正在使用 vue js 和 axios。
这是我正在尝试做的事情:
我的“大纲”数组通常包含 3 到 9 个条目。我想在每个条目上 运行 一个 axios 请求(运行SecondFunction()),但一次只有 运行 1 个请求(等待每条记录被获取,然后再启动另一个记录请求,而不是一次全部。如果其中一个请求失败,则会显示一条错误消息。现在,它可以正常工作,但是一些请求先于其他请求完成,并且我的索引位置在响应中是错误的。
method1(){
for (const [index, value] of this.splitOutlines.entries()) {
this.runSecondFunction(value, index);
}
}
runSecondFunction(value, index){
let formData = {
title: this.blog.value,
subheading: value
};
axios.post('/dashboard/paragraphs', formData).then((response) => {
this.articles.push({
index: index,
subheading: response.data.subheading,
paragraph: response.data.data.ideas[0],
});
}).catch(error => {
//
});
}
知道怎么做吗?
谢谢
一种方法是在出现错误时将错误对象推入数组。
axios.post('/dashboard/paragraphs', formData).then((response) => {
this.articles.push({
index: index,
subheading: response.data.subheading,
paragraph: response.data.data.ideas[0],
});
}).catch(error => {
this.articles.push({ error });
});
或者您可以将文章更改为普通对象而不是数组,并分配给对象的属性而不是推送。
axios.post('/dashboard/paragraphs', formData).then((response) => {
this.articles[index] = {
index: index,
subheading: response.data.subheading,
paragraph: response.data.data.ideas[0],
}
}).catch(error => {
如果您真的坚持这些而不是 运行 同时进行,那么您将不得不做以下两件事之一。你可以让 method1
调用一个 async
函数并在它周围抛出一个 try catch,同时组成一个新数组并 returning 或在其他地方设置它。例如
method1(){
(async function () {
const requests = []
for (const [index, value] of this.splitOutlines.entries()) {
try {
const res = await this.runSecondFunction(value, index);
requests.push(res)
} catch (e) {
requests.push(e)
}
}
return requests
)().then(reqs => {
// do other stuff with the completed requests.
})
}
这应该保证请求的顺序得到遵守,并且一次只有一个 运行。
否则,您将不得不在 .then
方法中执行某种递归实现。
编辑::
我忘了在你的 runSecondFunction
方法中提到,你需要 return 承诺,所以它应该是这样的:
runSecondFunction(value, index){
let formData = {
title: this.blog.value,
subheading: value
};
return axios.post('/dashboard/paragraphs', formData)
}
这样,mehtod1
中的 await
会将文章分配给我所谓的 res
(当然,您可以根据需要以任何方式操作此数据)。
但如果您希望它们出现在数组中,请不要处理 runSecondFunction
内的错误。