等待查询结果

时间:2017-05-30 06:58:26

标签: javascript node.js promise async-await couchbase

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

我想按顺序运行查询:

  1. 运行查询A
  2. 处理结果A
  3. 运行查询B
  4. 处理结果B
  5. ...
  6. 在完成所有结果并处理后继续
  7. 甚至可能更好

    1. 运行所有查询
    2. 在他们被照料时逐一研究成果
    3. 在完成所有结果并处理后继续
    4. 重点是我不知道在继续之前如何等待所有查询完成。我做了许诺,但我是nodeJS的新手,我不确定我是否正确使用它们,也许有人能指出我正确的方向?

      我看到async / await功能在节点中可用但我无法使其正常工作。

      任何帮助都会让人感激不尽!

      修改

      我尝试使用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错误。我在SO post上发现这意味着方法queryAsync没有async关键字。

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

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用回调:



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




但是,这导致了回调地狱,需要避免,所以你应该更喜欢使用Promises

已存在一个从回调到承诺的基础的端口:https://www.npmjs.com/package/couchbase-promises

这会将回调转换为:

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

之后你甚至可以考虑async/await,这会使你的代码更具可读性:

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

答案 1 :(得分:1)

Promise.all()允许您运行承诺列表并等待所有履行(或第一次拒绝)。您必须使用couchbase-promises之类的内容或使用Bluebird或Q来宣传自己,因为Couchbase SDK不会返回承诺。

将查询作为承诺返回后,您可以将查询堆叠在一个数组中,并将其传递给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 }) 。这将返回一个新的promise,它将通过一系列结果解析。

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

如果你想在这里使用async / await,你可以这样做:

*

答案 2 :(得分:0)

您可以使用Async water fall库作为最佳库,逐个序列化该函数 这里是链接water fall library它将从第一个函数开始执行,直到最后一个函数