【问题标题】:Using Axios.all for an array of post calls in a for loop将 Axios.all 用于 for 循环中的一系列 post 调用
【发布时间】:2018-08-16 02:58:38
【问题描述】:

目前我正在尝试运行一个 for 循环,该循环表示为数组中的每个 JSON 对象创建一个 axios post 调用并将其添加到数组中。然后我使用 Axios.all 一次调用它们。我遇到的问题是每个 post 调用的 JSON post 对象都是相同的。

let axiosArray = []
let postData = {}
for (int x = 0; x < numOfItems; x++) {

postData['size'] = shoe.size
postData['color'] = shoe.color
let newPromise = axios({
  method: 'post',
  url: postShoe,
  data: postData
})
  .then(responsed => {
    console.log('success')
  })
  .catch(error => {

    console.log('error')
  })
  axiosArray.push(newPromise)
}
  axios
.all(axiosArray)
.then(() => {
  console.log('submitted all axios calls')
})
.catch(error => {})

它像我想要的那样运行两个 post 调用,但它使用为每个调用提供给 postData 的最后一个值。我想知道是否有一种方法可以将所有数据保存在我创建它时的承诺中,然后在提交时它不仅会使用提供给 postData 的最后一个值。

【问题讨论】:

    标签: javascript node.js axios


    【解决方案1】:

    axios.all 期望在没有then 的情况下收到未处理的承诺。要迭代响应 axios.spread 接受响应作​​为其参数。下面的代码应该可以工作(当然可以更简洁)。

    let axiosArray = []
    for (int x = 0; x < numOfItems; x++) {
      let postData = {}
      postData['size'] = shoe.size
      postData['color'] = shoe.color
      let newPromise = axios({
          method: 'post',
          url: postShoe,
          data: postData
        })
      axiosArray.push(newPromise)
    }
    
    axios
      .all(axiosArray)
      .then(axios.spread((...responses) => {
        responses.forEach(res => console.log('Success'))
        console.log('submitted all axios calls');
      }))
      .catch(error => {})
    

    您也可以参考与您的问题类似的post

    【讨论】:

    • 我遇到的问题不是回复。每个 post 调用都使用相同的 postData json 结构。如果我想添加 300 只鞋子,它只会添加最后输入的 300 次,而不是创建承诺时的 postData。
    • 那是因为postData是在循环外声明的,javascript通过引用访问对象。在循环中声明postData 对象将解决该问题。我已经编辑了答案以反映相同的情况。
    • 我不断收到消息 axios.all is not a function
    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2018-11-07
    • 2013-03-17
    • 1970-01-01
    • 2019-03-12
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多