【问题标题】:synchronous loop in nodejsnodejs中的同步循环
【发布时间】:2015-07-26 22:25:47
【问题描述】:

//Importing: postges DB connection
var pg = require('pg');
var conString = "postgres://readxxx:p@ssword@vmwoxxx-tst:8888/worxxx";
var prvsiteid = '';
var cursiteid = '';
var qurystring = '';

pg.connect(conString, function(err, client, done) {
  if (err) {
    return console.error('error fetching client from pool', err);
    return;
  }
  
  client.query("select site_id,created_at,started_at,completed_at,notes,finish_code from _background_tasks where finish_code > 0 and site_id > 0 and abs(extract(Epoch from (now()::timestamp without time zone - completed_at)))/60 <= 4600 order by site_id asc", function(err, result1) {
    done();
    if (err) {
      return console.error('error running query', err);
      return;
    }
    for (var i = 0; i < result1.rowCount; i++) {
      cursiteid = result1.rows[i].site_id;
      if (prvsiteid != cursiteid) {
        prvsiteid = cursiteid;
        qurystring = "select trim(su.name) as name, case When trim(su.email) is null then su.name || '@netapp.com' when trim(su.email) > '' then su.name || '@netapp.com' else su.name end uemail,su.friendly_name as frdname from system_users su where su.state = 'active' and su.id in (select distinct(system_user_id) from users u where u.site_id = " + cursiteid + "and u.admin_level >= 5)"
        client.query(qurystring, function(err, result2) {
          done();
          if (err) {
            return console.error('error running query', err);
            return;
          }
          for (var j = 0; j < result2.rowCount; j++) {
            console.log(cursiteid, result2.rows[j].name, result2.rows[j].uemail, result2.rows[j].frdname);
          }
        });
      }
      console.log(result1.rows[i].site_id, result1.rows[i].created_at, result1.rows[i].started_at, result1.rows[i].completed_at);
    }
  });
});

我知道 NodeJS 程序是异步的,但我希望它是同步的。

for loop(outer) --> for loop(inner) 当外部 forloop 更改为新站点 id 时,我想从内部循环向所有 emailids 发送电子邮件,并且外部循环的每个站点的结果行必须打印出来的。

【问题讨论】:

  • 请正确格式化您的代码。
  • 你需要使用async.each之类的东西。此外,我相信在您的第一个 client.query 之后立即致电 done 是错误的
  • 我是 nodejs 甚至是 java 家族的宝贝...请帮助我了解我需要对代码进行哪些更改才能达到预期效果...感谢您的帮助

标签: node.js postgresql


【解决方案1】:
  1. 如果你使用的库不支持同步操作,那么你就不能同步使用它而不会产生厌恶(你确实不想在你的代码中想要厌恶。不管老板怎么压)。
  2. 您可以相当简单地使用 Promises,特别是 bluebird 对异步操作执行循环和其他操作,它支持基于回调的异步操作函数并将它们转换为 Promise-ready 函数。

【讨论】:

  • 我是 nodejs 甚至是 java 家族的宝贝...请帮助我了解我需要对代码进行哪些更改才能达到预期效果...感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2020-05-31
  • 2015-03-14
相关资源
最近更新 更多