使用节点和火库循环访问数千条记录
Looping through thousands of records using node and firebase
我的Firebase数据存储中有大约10,000条记录,每条记录都附加了一些数据,例如。
productName: {
price: 10.00,
lastChecked: timestamp,
url: 'http://product/url',
imagePath: 'http://product/image/url'
}
我遍历每个产品,它检索到每个产品数据,然后执行其他任务。
当我只有几百条记录时,我让它全部工作,但现在我有数千条(还有更多(,当我运行任务时,它会崩溃 du 到 CPU 过载,并且大多数产品不执行其任务。
我已经阅读了有关循环阻塞的信息,并尝试了回调中的超时,我在几篇文章中读到了这些帖子,这些帖子有所改进,但尚未设法防止服务器CPU过载。
这是我从另一篇文章中实现的示例。
getProductData = function(product, callback){
ref.child('products/'+product).once('value', function(snapshot) {
callback(snapshot.val(), product);
});
},
queryProductData = function(product){
getProductData(product, function (productData, productKey) {
setTimeout(scrapeProductDetails(product), 2000) //queue for next ping in the next predefined interval
});
},
productLoop = function(productsList) {
for (var product in productsList)
{
setTimeout(queryProductData(product), 2000) //queue job. Every 2 seconds, query_host will be called.
}
}
这是作为 Node 服务而不是网站运行的,因此将在后台运行。
关于这一点:
for (var product in productsList)
{
setTimeout(queryProductData(product), 2000)
}
这里有两件事不太对劲:
通过执行
setTimeout(queryProductData(product), 2000)
,您已经在计时器启动之前运行了该函数。研究bind
来解决这个问题。for 循环一次遍历每个产品并创建计时器,因此每个计时器将在同一时刻启动。结果:for 循环后 2 秒,所有函数将同时运行。所以你基本上仍然一次做所有事情,但你增加了 2 秒的延迟。
您可能想要的是这样的结构:
index = 0
function nextProduct() {
productName = productsList[index] // get current product from list
// Do what you need with productName
index++ // Next product
}
setInterval(nextProduct, 2000);
nextProduct
每次调用时都会从列表中获取下一个产品,并且setInterval
每 2 秒重复调用nextProduct
一次。
上述注意事项:如果同步运行nextProduct
需要 2 秒以上,则在调用下一个函数时可能不会更新index
,因此最好在使用它获取产品名称后立即更新index
,而不是像我的示例那样在最后更新。
另一种解决方案是让nextProduct
完成后调用自己,而不是使用 setInterval
.但是,在使用递归函数时,您需要克服其他问题(例如堆栈大小限制(,因此我建议您不要将其用于您的用例。
我希望我的回答对您有所帮助,如果不能随意发表评论,我会再看看它。
- 如何使用 Backbone 将多条记录呈现到 html 表中.js .
- 使用Javascript将多条记录插入SQLite数据库时出错
- AngularJS动态显示多条记录
- XrmSvcToolkit 问题最多只能提取 5000 条记录
- 在检索到最后一条记录后从 PostgreSQL 中提取记录
- 子网格:限制用户仅选择一条记录
- MSCRM异步javascript SDK.REST.retriveMultipleRecords只返回50条记录,一次
- CSS悬停在JQuery循环的最后一条记录中不起作用
- 数据中的一条记录使用浮动图时未创建饼图
- "[总计]的装载记录编号[#]”;进度条
- 是为大约100条记录中的每一条呈现一个表单更快,还是用ajax加载单个表单更快
- “自动完成”文本框未前进到下一条记录
- 如何使用 JavaScript 函数在 JSP 中使用按钮移动到数据库的最后一条记录
- Sencha ExtJS store.nextPage() 然后 store.first() 给出前一页的第一条记录
- 从角度ng重复中隐藏最后2条记录
- PHP 多条记录插入
- 剑道网格在删除后仍显示最后一条记录
- 记录了条带呼叫,但没有进行测试收费
- 使用节点和火库循环访问数千条记录
- Redux:每个记录一个表单,可能有数千条记录