[英]How do I best handle this pagination with asynchronous Node.js?
我的问题涉及异步代码的使用。
这是相关的伪代码:
function handleQueryMore(result) {
conn.queryMore(result.nextRecordsUrl, function(err, resultMore){
if (err) {}
//do stuff with result
if (!resultMore.done){
handleQueryMore(resultMore);
}
});
}
//(below code runs first when launched of course)
var conn = new jsforce.Connection({////etc
var sql = "SELECT //.......
conn.query(sql, function(err, result) {
if (err) {}
//do stuff with result
if (!result.done) //didn't pull all records
{
handleQueryMore(result);
}
});
初始查询仅返回一定的最大记录数,然后递归调用handleQueryMore()以处理每个额外的记录块。
最初,我在where (!result.done){}
循环中只有一个conn.query()
,但是当然问题是conn.query()
代码异步运行,并且没有机会在下一次循环(导致〜无限无目的循环)。
有第3方库方法可以使代码同步运行,但是我猜想我没有遵循一些基本的设计范例。 递归有效,但是我担心如果查询返回大量的记录,可能需要的内存量。
即使我知道需要分页的记录数,我也必须要有result.nextRecordsUrl
才能分页,在执行每个先前的查询之前,我无法获得该分页...因此,我不能只在同时。
有人在乎这个吗?
谢谢!
使用async.js包。
function handleQueryMore(result) {
conn.queryMore(result.nextRecordsUrl, function(err, resultMore) {
if (err) {}
//do stuff with result
else {
async.each(result.data, function(individualData, callback) {
// do some async task
callback(); // to tell that this is completed
//callback(err); if there is any error while processing data
}, function(error) {
if (!error) {
if (!result.done) //didn't pull all records
{
handleQueryMore(result);
}
}
});
}
});
}
var conn = new jsforce.Connection({ ////etc
var sql = "SELECT //.......
conn.query(sql, function(err, result) {
if (err) {} else {
async.each(result.data, function(individualData, callback) {
// do some async task
callback(); // to tell that this is completed
//callback(err); if there is any error while processing data
}, function(error) {
if (!error) {
if (!result.done) //didn't pull all records
{
handleQueryMore(result);
}
}
});
}
});
});
我根本不会那样做。 当您获得更大的数据集时,效率极低。 取而代之的是,我将使用querystring参数,这些参数指示我要开始的记录索引和要返回的计数。 所有数据库都具有等效的跳过和获取(例如,如果您使用的是jsforce方法链API,则可以执行.skip(5).take(10)以返回一组记录6-16)。 通过使每个请求彼此独立,这大大简化了代码并降低了风险。
另外,我注意到注释//(below code runs first when launched of course)
, //(below code runs first when launched of course)
,但这也不是一个好主意。 理想情况下,您希望按需查询数据库,而不是在应用程序启动时查询。 这也可能就是您遇到挑战的原因。
user.aggregate({ $match: { status: true, type: req.query.type } },
{ "$skip": (skipValue) }, { "$limit": limitValue },
(err, data) => {
//Code
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.