nodejs中的同步循环

//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程序是asynchronous的,但这种情况下,我打算它是同步的。

for循环(外部) – > for循环(内部)当外部forloop更改为新的站点ID我想发送电子邮件到所有内部循环的emailids和外部循环的每个站点的结果行已打印。

  1. 如果你正在使用的库不支持同步操作,那么你不能同时使用它,而不是可憎的(你不想在你的代码中使用可憎的东西,不pipe你的老板有多大的压力)。
  2. 通过使用Promises ,您可以相当简单地对asynchronous操作执行循环和其他操作,特别是bluebird ,它支持基于callback的asynchronous函数并将其转换为Promise就绪函数。