2017-05-30 95 views
0

我正在使用Couchbase nodeJS SDK。为了查询我必须调用bucket.query("SELECT ...", function(err, rows){console.log("query's result received")})等待查询结果

我想运行查询顺序,如:

  1. 运行查询的结果的
  2. 工作
  3. 运行查询B关于结果B
  4. 工作
  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错误。我发现在这个SO post,这意味着方法queryAsync没有async关键字。

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

回答

2

做到这一点的naivest方法是使用回调:

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) 

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

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

你能检查我的编辑?我尝试了你提出的建议,但它看起来不像我期望的那样工作。 – MHogge

+0

为了使用'await',你的函数应该是'async',这就是为什么你有一个错误,你也需要节点7.6+,检查我的答案中的链接 – notgiorgi

+0

我误解了关于'async'的部分!我认为被调用的函数应该是异步的,但它应该是调用函数。谢谢 ! – MHogge

1

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) 
+0

>等待所有的履行(或第一次拒绝) 他们的方式是继续错误而不是退出第一次拒绝? – MHogge

0

您可以使用异步瀑布库最好库连载一个由这里一个 功能是链接water fall library它将开始执行从第一个功能,并将继续到最后一个功能