在我的代码结束时,我有两个同时运行的操作,一个创建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();
});
答案 0 :(得分:1)
Nodejs cassandra驱动程序支持promises,因此可以像下面这样简单地完成:
if (count > 1) {
for (const key of keys) {
await client.execute(queryadd);
}
}
await client.execute(queryinsert, params, { prepare: true });
await client.shutdown();
如果要并行执行所有queryadd
然后查询插入,则可以执行以下操作:
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();
答案 1 :(得分:0)
如果使用基于回调的执行,则应使用控制流库。例如,使用async library:
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()
应该使用once in your application lifetime 答案 2 :(得分:0)
您可以将逻辑编写为顺序逻辑,并通过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被解决/拒绝。