javascript - Javascript竞争条件多个承诺连接字符串
问题描述
我有一个接收用户名数组的函数。对于每一个,我需要获取连接 ID 并连接到另一个数组中。但我认为我确实遇到了一些竞争条件问题,这些问题可能会发生冲突并连接更少的结果,它应该......
const getConnections = async function (usernames) {
let connections = [];
await Promise.all(usernames.map(async (username) => {
try {
let connsFound = await dynamo.getConnectionsByUsername(username);
if (connsFound && connsFound.length > 0)
connections = connections.concat(connsFound);
} catch (error) {
console.error('ERROR GET CONNECTIONS', error)
}
}));
return connections;
};
连接的结果是一个数组,所以我想合并到 var 连接的结果......但是 .concat 不合并,它创建一个新数组,所以我需要做一个 'var = var.concat(新数组)'
我担心这不安全,并且在某些操作中它会碰撞并覆盖某些结果...
有更好的方法吗?
干杯
解决方案
JavaScript 是单线程的,所以总是最多只有一个函数可以运行和访问connections
. 你不应该有任何问题。
但是,没有理由这样做。由于您已经在使用async/await
,您可以创建一个数组数组并将其展平:
const getConnections = async function (usernames) {
const connections = await Promise.all(usernames.map(async (username) => {
try {
return await dynamo.getConnectionsByUsername(username);
} catch (error) {
console.error('ERROR GET CONNECTIONS', error);
return [];
}
}));
return connections.flat();
};
.flat
相对较新,但编写自定义帮助函数来实现相同的功能应该很容易。
推荐阅读
- django - 通过在 django test 中修补自定义后端登录到测试客户端
- javascript - Firestore 在一个事务中读取/更新文档数组
- javascript - 在javascript中格式化数字
- swift - 如何使用 Combine 向服务器发送异步加速度计更新
- tensorflow - `tensorflow_io.bigquery` 返回 `Empty update [Op:IO>BigQueryReadSession]` 错误
- icons - 令人困惑的图标/网站图标
- java - 为什么while循环执行两次?
- kubernetes - k8s 选择器表达式中的引号是否重要?
- html - 我在 html 中创建了一个输入标签,但我不知道如何保存用户输入
- python - 线性不等式约束在 Drake 中不起作用