运行同一个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');
}
}
运行下:
我 运行 在外部包装函数中等待 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');
}
}