Promise和Async功能出现问题

时间:2019-11-29 21:32:15

标签: node.js vue.js

我正在尝试使用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)
      })
  })
}

1 个答案:

答案 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}的对象}。