我正在使用Couchbase nodeJS SDK。要进行查询,我必须致电bucket.query("SELECT ...", function(err, rows){console.log("query's result received")})
我想按顺序运行查询:
甚至可能更好
重点是我不知道在继续之前如何等待所有查询完成。我做了许诺,但我是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
关键字。
有关如何实现预期行为的任何想法? 谢谢!
答案 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它将从第一个函数开始执行,直到最后一个函数