提问者:小点点

在作用域之外保留数组空白的异步函数[重复]


我正在使用一个异步函数来尝试将数据拉入一个带有Axios的数组。 当我在下面的forEach中记录数据时,它会显示出来,但是当我在forEach之外记录数据时,它会返回空白。 我假设这是因为程序仍在运行,但我不确定如何在没有超时的情况下解决。

const user = async(IDs) => {

    var output;
    var URL;
    var result = [];

    IDs[0].forEach(async(id) => {
        URL = "https://example-api.com/" + id;
        output = await axios.get(URL)
            .then(function(data){
                result.push(data.data.text);
                console.log(result) // Returns the data
            });
    })

    console.log(result) // returns blank

}

共3个答案

匿名用户

   const user = async(IDs) => {
    var output;
    var URL;
    var result = [];

    for (const id of IDs[0]) {
        URL = "https://example-api.com/" + id;
        try {
            output = await axios.get(URL);
            result.push(data.data.text);
        } catch (error) {
            console.log(error)
        }
    }
}

试一试

匿名用户

所有其他的解决方案都是好的,但是它们都是一个接一个地获取数据,这会使您的代码稍慢一些。

使用这种方法,因为它将充分利用事件循环,这将更快地执行您的程序。

const result = await Promise.all(IDs[0].map(id => {
  return axios.get(`https://example-api.com/${id}`)
    .then(data => (data.data.text)) 
}))

匿名用户

@Shubham提出了最有效的解决方案(Promise.allArray.map),但是,将Async/AwaitPromise.Then相结合会破坏可读性,特别是随着复杂性的增加。

在可能的情况下,应首选等待而不是承诺。然后:

const result = await Promise.all(IDs[0].map(async id => {
    const data = await axios.get(`https://example-api.com/${id}`);
    return data.data.text;
}));

相关问题