繁体   English   中英

Node.js执行顺序查询

[英]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()链接以下调用。

一些建议:

您可以将逻辑编写为顺序逻辑,然后通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM