繁体   English   中英

我如何最好地使用异步Node.js处理这种分页?

[英]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) ,但这也不是一个好主意。 理想情况下,您希望按需查询数据库,而不是在应用程序启动时查询。 这也可能就是您遇到挑战的原因。

嗨,如果您使用的是mongo db,请尝试此操作。

   user.aggregate({ $match: { status: true, type: req.query.type } },
        { "$skip": (skipValue) }, { "$limit": limitValue },
        (err, data) => {
//Code
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM