node.js - 在 forEach 中完成每个异步任务后执行回调

标签 node.js postgresql asynchronous

我正在编写一些 PostgreSQL 事务,我需要在执行 forEach 中的每个函数后执行回调。这是一些代码:

var sql = "BEGIN;UPDATE object SET name = "+data.name+", object_subtype_id = "+data.object_subtype_id+" WHERE id = "+data.id+";";
db.driver.execQuery(sql, function(err, result) {
  data.object_subtype.object_property_type.forEach(function(item) {
    db.driver.execQuery("WITH upsert AS (UPDATE object_property SET value = '"+item.value+"' WHERE object_property_type_id = "+item.id+" AND object_id = "+data.id+" RETURNING *) INSERT INTO object_property (object_property_type_id, object_id, value) SELECT "+item.id+", "+data.id+", '"+item.value+"' WHERE NOT EXISTS (SELECT * FROM upsert);", function(err, nb) {
      // I need to send the COMMIT; here once all the functions in the forEach have been executed
    });
  });
});

我看过async但我不确定如何或是否可以将其应用于我的情况。

有什么想法吗?

谢谢!

最佳答案

结合 async.series 和 async.each 你会得到这个美丽的片段:

var sql = "BEGIN;UPDATE object SET name = "+data.name+", object_subtype_id = "+data.object_subtype_id+" WHERE id = "+data.id+";";

async.series([
  function (next) {
    db.driver.execQuery(sql, next);
  },
  function (next) {
    async.each(data.object_subtype.object_property_type, function (item, next) {
      db.driver.execQuery("WITH upsert AS (UPDATE object_property SET value = '"+item.value+"' WHERE object_property_type_id = "+item.id+" AND object_id = "+data.id+" RETURNING *) INSERT INTO object_property (object_property_type_id, object_id, value) SELECT "+item.id+", "+data.id+", '"+item.value+"' WHERE NOT EXISTS (SELECT * FROM upsert);", next);
    }, next);
  }
], function (err, results) {
  // Not sure what you want to do with the result
});

它可能需要一些调整,具体取决于您想要的结果。

关于node.js - 在 forEach 中完成每个异步任务后执行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321335/

相关文章:

ios - 同步两个数据库源的算法?

java - spring项目中的多线程无法正常运行

java - 我可以忘记 Cassandra java 驱动程序中的 ResultSetFuture 而不会面临内存泄漏吗?

javascript - Soundcloud 使用 NodeJS 登录并喜欢声音问题 - 401 未经授权

java - "java.lang.NoSuchFieldError: NONE"与 Spring 3、maven、JPA、c3p0 hibernate

javascript - Node.js, express, Passport 认证 "Bad Request"

Postgresql通用触发器函数?

.net - .NET 4.0 异步单元测试

node.js - 如何在 Mongoose 中使用 .slice

javascript - BrowserStack - Node.js 并发测试