等待查询结果
Wait for queries results
我正在使用 Couchbase nodeJS SDK。要进行查询,我必须调用 bucket.query("SELECT ...", function(err, rows){console.log("query's result received")})
我想 运行 按顺序查询:
- 运行查询A
- 处理结果 A
- 运行查询B
- 处理结果 B
- ...
- 收到所有结果并处理后继续
甚至更好
- 运行 所有查询
- 在收到结果时一项一项地处理结果
- 收到所有结果并处理后继续
关键是我不知道如何等待所有查询完成后再继续。我信守诺言,但我是 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
错误。我在这个 上发现这意味着方法 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)
在那之后你甚至可以考虑 async/await 这将使你的代码更具可读性:
try {
const rows = await bucket.query(...)
// do other things
catch (e) {
// handle errors
}
Promise.all() allows you to run a list of promises and wait for all fulfillments (or the first rejection). You'll have to use something like couchbase-promises or promisify yourself using Bluebird 或 Q,因为 Couchbase SDK 不 return 承诺。
一旦您将查询 return 作为承诺,您只需将查询堆叠在一个数组中,然后将其传递给 Promise.all()
。这将 return 一个用一系列结果解决的新承诺。
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)
您可以使用 Async water fall library 它最好的库来逐一序列化函数
这是 link water fall library 它将从第一个函数开始执行,直到最后一个函数
我正在使用 Couchbase nodeJS SDK。要进行查询,我必须调用 bucket.query("SELECT ...", function(err, rows){console.log("query's result received")})
我想 运行 按顺序查询:
- 运行查询A
- 处理结果 A
- 运行查询B
- 处理结果 B
- ...
- 收到所有结果并处理后继续
甚至更好
- 运行 所有查询
- 在收到结果时一项一项地处理结果
- 收到所有结果并处理后继续
关键是我不知道如何等待所有查询完成后再继续。我信守诺言,但我是 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
错误。我在这个 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)
在那之后你甚至可以考虑 async/await 这将使你的代码更具可读性:
try {
const rows = await bucket.query(...)
// do other things
catch (e) {
// handle errors
}
Promise.all() allows you to run a list of promises and wait for all fulfillments (or the first rejection). You'll have to use something like couchbase-promises or promisify yourself using Bluebird 或 Q,因为 Couchbase SDK 不 return 承诺。
一旦您将查询 return 作为承诺,您只需将查询堆叠在一个数组中,然后将其传递给 Promise.all()
。这将 return 一个用一系列结果解决的新承诺。
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)
您可以使用 Async water fall library 它最好的库来逐一序列化函数 这是 link water fall library 它将从第一个函数开始执行,直到最后一个函数