【问题标题】:Wait for queries results等待查询结果
【发布时间】:2017-10-30 12:48:12
【问题描述】:

我正在使用 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. 在收到并处理所有结果后继续

甚至更好

  1. 运行所有查询
  2. 在收到结果时一一处理
  3. 在收到并处理所有结果后继续

关键是我不知道如何在继续之前等待所有查询完成。我坚持承诺,但我是 nodeJS 的新手,我不确定我是否正确使用它们,也许有人可以指出我正确的方向?

我看到 node 中提供了 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 关键字。

知道如何实现我的预期行为吗? 谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      一旦您有一个查询作为承诺返回,您可以将您的查询堆叠在一个数组中,然后将其传递给Promise.all()。这将返回一个新的 Promise,该 Promise 使用一组结果进行解析。

      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
      })
      

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

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

      【讨论】:

      • > 等待所有的履行(或第一次拒绝)他们是一种继续错误而不是在第一次拒绝时退出的方法吗?
      【解决方案3】:

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

      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

      this 将回调转换为 this:

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

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

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

      【讨论】:

      • 您能检查一下我的编辑吗?我尝试了您的建议,但似乎没有按我预期的方式工作。
      • 为了使用await,你的函数应该是async,这就是你出错的原因,你还需要节点7.6+,查看我的答案中的链接
      • 我误解了关于async 的部分!我认为被调用的函数应该是异步的,但它应该是调用函数。谢谢!
      • dunno about "naivest way" 非常适合简单的操作。并非每个脚本都用于核反应堆..谢谢!
      猜你喜欢
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2019-04-19
      • 2012-10-28
      • 2014-03-03
      • 1970-01-01
      相关资源
      最近更新 更多