通过昂贵的异步函数迭代 - 内存约束,递归



我认为在我的node.js服务器端应用程序中使用诺言是一个基本问题 - 不幸的是,尽管看到了如何解决它其他类似的问题(我认为)。

基本上我的问题是:我正在尝试检索一些外部数据,然后对其进行处理。有很多数据,所以我必须按页面检索它。此外,给定数据的大小,我的服务器无法在我用完内存和服务器崩溃时一次执行多个呼叫/进程。我不知道直到执行时间我必须检索多少页才能获取所有数据。

我尝试执行具有一个页面数量的foreach循环,但是这显然不起作用。例如:

pages = [1,2,3,4];
pages.forEach( function(pageNumber){
  veryMemoryExpensiveFunctionRetrievingAndProcessingPage(pageNumber).then(
// handle the results);
})

(这里的行为是所有函数同步执行,并且服务器运行到内存)。

我很呆在这里 - 我知道我需要同步多次执行该功能,但不知道从哪里开始!我还尝试了递归,但是这再次导致内存,因为每个呼叫都会添加到堆栈中。

您需要在上一页完成时获得每个页面的承诺,而不是一次。即

function fetchAndProcessPages(i, handlePage) {
    retrievePage(pages[i]).then(page => {
        handlePage(page);
        if (i+1 < pages.length) fetchAndProcessPages(i+1, handlePage);
    });
}
fetchAndProcessPages(0, page => console.log(page));

最新更新