我正在尝试使用Promise和异步函数将数组的块发送到将它们插入数据库的api调用。我正在尝试使顶部函数对数组进行分块,并等待后端完成,然后它将移至下一个分块。它在第一次迭代后出错。有什么想法吗?
async chunkArray(arr) {
let len = arr.length
let update_arr
let i = 1
for(i; i<=len; i++) {
if((i%125) === 0) {
update_arr = arr.slice(i-125,i)
await this.updateChuckArray(update_arr)
} else if(i === len) {
let div = (Math.floor(len/125) * 125)
update_arr = arr.slice(div, len)
await this.updateChuckArray(update_arr)
}
}
},
updateChuckArray(update) {
return new Promise(resolve => {
this.$http.put(`/route`, update).then(res => {
res.data.error ? this.$root.updateError(res.data.error) : this.$root.updateSuccess(res.data.message)
}).catch(error => {
this.$root.updateError(res.data.error)
})
})
}
答案 0 :(得分:1)
首先,您的updateChuckArray()
永远不会解决它返回的承诺(您永远不会致电resolve()
)。
您可以直接返回已经拥有的诺言并像这样写它,而不是在函数调用周围手动包装新的诺言(即诺言反模式):
updateChuckArray(update) {
return this.$http.put(`/route`, update).then(res => {
res.data.error ? this.$root.updateError(res.data.error) : this.$root.updateSuccess(res.data.message);
}).catch(error => {
this.$root.updateError(error);
})
}
仅供参考,您不清楚您的错误处理策略是什么。编写代码的方式(上面是紧随其后的),您从this.$http.put()
捕获了一个错误并进行了处理,然后使循环继续进行。如果那是您想要的,那么它将起作用。如果您希望for
循环因错误而中止,则需要将错误重新抛出到.catch()
处理程序中,以便错误返回到await
。
此外,您不是在.catch()
处理程序中这样做的:
this.$root.updateError(res.data.error)
,但未定义res
。错误在error
中。您将需要使用它来报告错误。我不确定错误对象的结构在这里,或者您到底传递给$.root.updateError()
的对象是什么,但是它一定是来自error
对象的东西,而不是名为{{1}的对象}。