如何让函数在返回之前完成 for 循环

时间:2021-01-14 02:01:25

标签: javascript axios

下面是我输入的代码,用于遍历数组并将所需的数据粘贴到输出数组中,然后最终返回输出数组:

var stocks = ['AAPL', 'BMY']

let getInfo = arr => {
    let output = []
    arr.forEach(i => {
    var root = 'https://fmpcloud.io/api/v3/profile/' + i + '?apikey=myAPIKey'
        axios.get(root)
        .then((data) => {
            output.push(data.data)
            })
        .catch((e) => {
            console.log('error', e)
            })
  })
  console.log('output: ', output)
  return output
}

getInfo(stocks)

console.log 只记录一个空数组,这让我觉得它在 for 循环完成执行之前转到 return 语句。有没有人知道先完成 for 循环,然后最后返回输出数组的最佳方法?

5 个答案:

答案 0 :(得分:1)

那是因为 axios 是异步方法,return 语句应该在 axios().then() 之前返回。

使用 Promise.all() 和使用 async/await

var stocks = ['AAPL', 'BMY']

let getInfo = async arr => {
  let output = []
  const promises = []
  arr.forEach(i => {
    var root = 'https://fmpcloud.io/api/v3/profile/' + i + '?apikey=myAPIKey'
    promises.push(axios.get(root))
      .then((data) => {
        output.push(data.data)
      })
      .catch((e) => {
        console.log('error', e)
      })
  })
  const result = await Promise.all(promises)
  output = result.map(r => r.data)
  console.log('output: ', output)
  return output
}

getInfo(stocks)

答案 1 :(得分:1)

你可以使用 async/await 关键字让 axios 调用等待。喜欢:


let getInfo = async arr => {
    let output = []
 
    try {
      for(var i in arr) {
        var root = 'https://fmpcloud.io/api/v3/profile/' + arr[i] + '?apikey=myAPIKey'
        var data = await axios.get(root);
        output.push(data.data);
      }
    }
    catch(e) {
       // oops
       console.log('error', e);
       return null;
    }

    return output;

  }

答案 2 :(得分:0)

Axios.get 返回一个 promise,它异步执行,而 lambda 的其余部分继续执行。

查看 Promise.all() 以便您可以在所有 promise 解决后记录输出。

答案 3 :(得分:0)

var stocks = ["AAPL", "BMY"];

let getInfo = async (arr) => {
  const output = await Promise.all(
    arr.map(
      (i) =>
        new Promise(async (resolve, reject) => {
          try {
            const { data } = await axios.get(
              `https://fmpcloud.io/api/v3/profile/${i}?apikey=myAPIKey`
            );
            resolve(data);
          } catch (err) {
            reject(err);
          }
        })
    )
  );

  console.log("output: ", output);
  return output;
};

getInfo(stocks);

答案 4 :(得分:-1)

不要使用 forEach。使用 for/of 循环。接下来,使用 async/await 在 axios 调用。应该这样做。