等待查询结果



我正在使用couchbase nodejs sdk。要进行查询,我必须致电bucket.query("SELECT ...", function(err, rows){console.log("query's result received")})

我想依次运行查询:

  1. 运行查询
  2. 工作结果
  3. 运行查询B
  4. 工作结果b
  5. ...
  6. 在所有结果都被重新进行后继续并处理

甚至更好的是

  1. 运行所有查询
  2. 重新进行时,一一处理结果
  3. 在所有结果都被重新进行后继续并处理

关键是我不知道如何等待所有查询在继续之前完成。我竭尽全力,但我是Nodejs的新手,我不确定我是否正确使用了它们,也许有人可以将我指向正确的方向?

我看到异步/等待功能在节点中可用,但我也无法使其正常工作。

任何帮助都将是理想的!


编辑

我尝试使用Couchbase-Promises,但我仍然没有得到我期望的行为。这是我所做的:

console.log("start");
bucket.queryAsync(N1qlQuery.fromString('SELECT * FROM DATA_BUCKET WHERE type="BOOK"'))
  .then(function(rows){console.log("success")})
  .catch(function(err){console.log(err)})
console.log("end");

但是输出显示

start
end
success

我想要的是

start
success
end

我也尝试了const rows = await bucket.queryAsync("SELECT...),但我遇到了Unexpected identifier错误。我在此帖子上发现,这意味着方法queryAsync没有async关键字。

关于如何实现预期行为的任何想法?谢谢!

幼稚的做法是使用回调:

bucket.query('SELECT ...', function(err, rows) {
  bucket.query('SELECT ...', function(error, moreRows) {
    bucket.query('SELECT ...', function(...) {
      // sent data to client or something
    })
  })
})

但是,这导致了需要避免的回调地狱,因此您应该更喜欢使用Promises

已经存在从回调到承诺的Couchbase的端口:https://www.npmjs.com/package/couchbase-promises

这将回调转换为:

bucket.query('SELECT ....')
    .then(successCallback)
    .catch(errorCallback)

之后,您甚至可以考虑异步/等待,这将使您的代码更加可读:

try {
    const rows = await bucket.query(...)
    // do other things
catch (e) {
    // handle errors
}

Promise.all((允许您运行诺言列表并等待所有成就(或第一个拒绝(。您必须使用Couchbase-Promises之类的东西,或使用Bluebird或Q来承诺自己,因为Couchbase SDK无法返回承诺。

将查询返回作为承诺后,您就可以将查询堆放在数组中,然后将其传递给Promise.all()。这将返回一个新的承诺,以一系列结果解决。

list = [
  bucket.query("SELECT ..."),
  bucket.query("SELECT ..."),
  bucket.query("SELECT ...")
]
Promise.all(list).then(function(results){
  // results is an array
}).catch(function(err){
  // err is the first rejection encountered
})

如果您想在这里使用异步/等待,则可以做这样的事情:

[r1, r2, r3] = await Promise.all(list)

您可以使用Async Water Fall库的最佳库来序列化功能这是Link Water fall库,它将从第一个功能开始执行,并将继续执行直到最后一个功能

最新更新