为什么此Promise.all()函数仅返回最后一个解析的值?

时间:2020-07-19 22:52:42

标签: javascript android react-native axios

我正在尝试在React Native上制作一个持久的购物车。如果您仅添加了一项,则可以使用,但是如果添加了另一项,则所有项都将与添加的最后一项相同。我将其范围缩小到我们的getData()函数,该函数返回我们渲染的产品的数据。

  async getData(cartItems){
    let promises = []
    cartItems.forEach(item => {
      promises.push(productInfo(item.id))
    })
    return Promise.all(promises)
  }

productInfo()看起来像这样。

export function productInfo(product_id){
  vapeBluntPOST.url = baseUrl+'/api/productinfo'
  vapeBluntPOST.data.id = product_id 
  return axios(vapeBluntPOST).then(({data})=>(data))
}

问题似乎是Promise.all()返回的数组元素都与对应于最后一个promise的最后一个解析值相同。

1 个答案:

答案 0 :(得分:0)

问题出在vapeBluntPOST上,而productInfo不在本地范围内。因此,当promise解析时,它们都使用了最后一次调用中的值,而最后一次调用来自数组中的最后一个id。

假设您实际上在其他地方不需要该对象,简单的解决方法是仅使用局部变量:

export function productInfo(product_id){
  const vapeBluntPOST = { /* common configuration that you need */};
  vapeBluntPOST.url = baseUrl+'/api/productinfo'
  vapeBluntPOST.data.id = product_id 
  return axios(vapeBluntPOST).then(({data})=>(data))
}