遍历昂贵的异步函数——内存限制、递归?

Iterating through expensive async function - memory constraints, recursion?

我遇到了一些问题,我认为这是关于在我的 node.JS 服务器端应用程序中使用 Promises 的基本问题 - 不幸的是,尽管我看到了其他类似的问题,但我看不出如何解决它(我想)。

基本上我的问题是: 我正在尝试检索一些外部数据,然后对其进行处理。有很多数据,所以我必须一页一页地检索它。另外考虑到数据的大小,我的服务器无法一次执行多个 calls/processes,因为我 运行 内存不足并且服务器崩溃。直到执行时我才知道我必须检索多少页才能获取所有数据。

我已经尝试使用页数数组执行 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));