Node.js执行顺序查询

时间:2017-06-08 15:22:09

标签: javascript node.js cassandra

在我的代码结束时,我有两个同时运行的操作,一个创建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();
  });

3 个答案:

答案 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()链接以下呼叫。

一些建议:

答案 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被解决/拒绝。