【问题标题】:Looping through promise and waiting?循环通过承诺和等待?
【发布时间】:2020-08-16 11:36:02
【问题描述】:

我创建了一个连接到 API 的函数,该 API 一次返回一个包含 100 个对象的数组。如果没有循环,则 getPageData() 函数在您传递 int 时起作用。但是,当我尝试遍历它时,它什么也没给我。设置超时功能似乎对循环没有帮助。

请帮忙

async function updateWholeDB(){
    var results = [];
    for (let i = 0; i < getPages(); i++) { 
        setTimeout(function() {
            getPageData(i).then((data) => {
                console.log(data)
                results.push(data) ;
            })
        }, 2000)

        }
    return Promise.all(results);
}

【问题讨论】:

  • Promise.all 在承诺之外?还有你期望 setTimeout 做什么?
  • Promise.all() 当您向它传递一组承诺而不是一组结果时,它是否正常工作。然后它返回一个解析为结果数组的承诺。所以,你没有正确使用它。
  • getPageData() 返回一个承诺。数据getPageData()returns 被推送到结果数组中。 Promise.all() 检查以确保结果数组已解决承诺。设置的超时是为了给承诺时间来解决
  • @Amissi setTimeout() 不会阻止执行,它在您的代码中完成的只是延迟对getPageData() 的每次调用。您的函数返回 return Promise.all(results) 将在任何超时或承诺解决之前发生,results 仍然是一个空数组。

标签: javascript loops express asynchronous async-await


【解决方案1】:

Promise.all() 当您向它传递一组承诺而不是一组结果时,它是否正常工作。然后它返回一个解析为结果数组的承诺。所以,你没有正确使用它。

此外,如果代码正确,这里似乎没有任何理由使用setTimeout()

如果您想要通过多次调用getPageData() 得到一系列结果,您可以这样做:

function updateWholeDB(){
    let promises = [];
    for (let i = 0; i < getPages(); i++) { 
        promises.push(getPageData(i));
    }
    return Promise.all(promises);
}

// usage
updateWholeDB().then(results => {
   console.log(results);
}).catch(err => {
   console.log(err);
});

这假设 getPageData() 返回一个可以正确解析您感兴趣的数据的承诺。如果不是这种情况,那么您也必须向我们展示该代码,以便我们就如何修复它提供建议。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2022-12-08
    • 2020-05-15
    • 2016-04-13
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2019-06-17
    • 2017-11-01
    相关资源
    最近更新 更多