尝试循环axios请求并异步推送

时间:2018-08-23 20:31:19

标签: javascript asynchronous async-await axios

async function getData() {
  let getProject =
    await axios.get('url', {
      auth: {
        username: 'username',
        password: 'pw'
      }
    })

  let projects = await getProject.data.value;
  let arr = []

  projects.map(project => {
    let item = axios.get(`url`, {
      auth: {
        username: 'username',
        password: 'pw'
      }
    })

    arr.push(item)
    console.log('arr', arr)
  })

  let result = await axios.all(arr)

  console.log('pr', result)

  return arr;
}

getProject中,我通过调用API获得项目的对象。然后,我尝试遍历这些获取的对象,并对每个项目使用唯一的URL来调用projects.map中的另一个API。

console.log('arr', arr)给了我一系列的Promises,其中有些是失败的请求,有些是成功的。这是因为某些项目可能没有有效的API。但是我想要一个成功的Promises数组。

这甚至没有到达console.log('pr' result)行,我不确定为什么。

我做对了吗?

1 个答案:

答案 0 :(得分:1)

尝试修改代码,以使arr是返回axio请求诺言的函数数组(而不是arr是实际的axios请求诺言数组,如您当前所做的那样):< / p>

let projects = await getProject.data.value;

// Map all project items to functions that return promises
let arr = projects.map(project => {

    // Return a function that returns a promise
    return function() {     

        // Returns a promise for GET request
        return axios.get(`url`, {
            auth: {
                username: 'username',
                password: 'pw'
            }
            })
    } 
})

// Axios.all will concurrently perform all GET requests 
// in arr (ie the mapping of projects to functions that
// return promises from axios.get )
let result = await axios.all(arr)

// Should print results from axio.get (if all requests successful)
console.log('pr', result)

这有点像axios.all这样的方法通常起作用的方式,并且类似于本机Promise.all方法。有关更多信息,请参见“ axios API” in the axios docs

上方的示例