运行同一个async函数并行导致变量混淆NodeJS

Running the same async function in parallel causes variable confusion NodeJS

运行下:

我 运行 在外部包装函数中等待 Promise.all() 中的以下函数。该函数本质上是进行一些互联网抓取,然后将行添加到 Postgres table。我调用该函数 3 次,使用分页偏移量来获得我需要的所有结果。

问题:

它添加了正确数量的行,但显然存在一些变量混淆,因为 table 中的输出有时有重复数据(并且重复数据不同于 运行 运行).我认为这是因为在 for 循环的每次迭代期间,它可能会同时从另一个 运行ning 函数引用内存中的数据。

代码:

const functionName = function (object, timestamp) {
  new Promise(resolve => {
    search.json(object, function (data) {
      resolve(data);
    })
  }).then(data => async function () {
    const client = await pool.connect();
    try {
      await client.query('BEGIN');
      let results = data.results
      if (results != null) {
        for (result of results) {
          let type = "item"
          let title = result.title
          var loop1 = result.loop1;
          var loop2 = result.loop2;
          let expiration = timestamp
          var time = result.time;

          await client.query(`INSERT INTO tableName (type, title, loop1, loop2, expiration, time) VALUES(, , , , , ) ON CONFLICT DO NOTHING`, [type, title, loop1, loop2, expiration, time]);
        }
      } else {
        console.log("No results")
      }
      await client.query('COMMIT');
    } catch (err) {
      console.log(err)
      await client.query('ROLLBACK');
    }
  }());
};

我怎样才能 运行 并行执行相同的函数,而不让一个函数内部的变量与另一个并发的 运行s 混淆?

for (result of results) { 缺少变量声明。始终使用严格模式以避免 the horror of implicit globals!

此外,返回 AIIFE 的箭头被传递给 then 也很奇怪。简化为

async function functionName { /*
^^^^^^ */
  const data = await new Promise(resolve => {
//             ^^^^^
    search.json(object, resolve);
  });
  const client = await pool.connect();
  try {
    await client.query('BEGIN');
    const {results} = data;
    if (results != null) {
      for (const result of results) {
//         ^^^^^
        const type = "item"
        const {title, loop1, loop2, time} = result;
        const expiration = timestamp;

        await client.query(`INSERT INTO tableName (type, title, loop1, loop2, expiration, time) VALUES(, , , , , ) ON CONFLICT DO NOTHING`, [type, title, loop1, loop2, expiration, time]);
      }
    } else {
      console.log("No results")
    }
    await client.query('COMMIT');
  } catch (err) {
    console.log(err)
    await client.query('ROLLBACK');
  }
}