[英]Node.js Execution order queries
在代码末尾,我有两个同时运行的动作,即一个生成Atler表的查询。 第二次插入。
问题是有时插入发生在alter table之前。
如何在for循环中为所有键执行代码的第一部分,然后继续进行插入?
if (count >1) {
for( var i = 0; i < keys.length -1; i++ ) {
client.execute (queryadd, { prepare: true }, function (err) {
console.log("do");
});
}
}
client.execute(queryinsert, { prepare: true }, function (err) {
console.log(err);
client.shutdown();
});
Nodejs cassandra驱动程序支持promise,因此可以很简单地完成:
if (count > 1) {
for (const key of keys) {
await client.execute(queryadd);
}
}
await client.execute(queryinsert, params, { prepare: true });
await client.shutdown();
如果要并行执行所有queryadd
,然后执行queryinsert,则可以执行以下操作:
if (count > 1) {
let queryadds = [];
for (const key of keys) {
queryadds.push(client.execute(queryadd));
}
await Promise.all(queryadds);
}
await client.execute(queryinsert, params, { prepare: true });
await client.shutdown();
如果使用基于回调的执行,则应使用控制流库。 例如使用异步库 :
const async = require('async');
async.eachSeries(keys, function eachKey(key, next) {
// Changing schema
client.execute(buildMyAlterQueryBasedOnKey(key), next);
}, function eachFinished(err) {
if (err) {
// TODO: Handle err
}
client.execute(queryinsert, params, { prepare: true }, function (err) {
console.log(err);
// Finished, you should invoke your callback here
});
});
如果使用的是Promises,则可以使用then()
链接以下调用。
一些建议:
ALTER TABLE
)。 shutdown()
应该在应用程序生命周期中使用一次 您可以将逻辑编写为顺序逻辑,然后通过nsynjs运行它:
步骤1.使其生效
function logic(count, keys, queryadd, queryinsert, client) {
if (count > 1)
for (var i=0; i<keys.length; i++)
client.execute(queryadd, { prepare: true });
client.execute(queryinsert, { prepare: true });
client.shutdown();
}
步骤2.通过nsynjs运行该函数:
nsynjs.run(logic,{},count, keys, queryadd, queryinsert, client, function () {
console.log('Done');
});
Nsynjs将自动检测是否有任何函数返回promise,并等待直到promise被拒绝/拒绝后再评估下一个表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.