2016-12-05 69 views
1

我在我的node.JS服务器端应用程序中使用Promise时遇到了一些问题,但很遗憾,我看不到如何解决它,尽管看到了其他类似的问题(我认为)。迭代昂贵的异步函数 - 内存约束,递归?

基本上我的问题是这样的: 我想检索一些外部数据,然后处理它。有很多数据,所以我必须逐页检索它。此外,考虑到数据的大小,我的服务器无法一次执行多个调用/进程,因为内存不足和服务器崩溃。我不知道直到执行时间为了获取所有数据,我必须检索多少页。

我已经尝试执行一个forEach循环与页数的数组,但是这显然不起作用。例如: -

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

(这里的行为是所有功能执行同步,服务器运行的内存)。

我在这里很卡住 - 我知道我需要同时多次执行该功能,但不知道从哪里开始这样做!我也尝试过递归,但是这又会导致内存不足,因为每次调用都会添加到堆栈中。

+0

听起来像你需要努力优化你的服务器端解决方案,而不是客户端。 –

+0

嗨,抱歉 - 我应该澄清,这是一个node.js服务器端应用程序 - 我从外部服务检索数据,修改它并将其插入到我自己的数据库中。我只能检索分页加上我自己的服务器似乎只能在内存中保存一定数量的页面而不会崩溃。因此,我想强制在自己的服务器端连续处理页面 –

+0

@JDeane首先:http://www.codexpedia.com/javascript/increasing-the-memory-limit-in-node-js/ – Niezborala

回答

1

当前一个完成时,您需要为每个页面获取一个承诺,而不是一次完成。即

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)); 
+0

这是万分感谢!似乎现在看起来很明显,但我想这总是如此! –