首页 > 解决方案 > 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(新数组)'

我担心这不安全,并且在某些操作中它会碰撞并覆盖某些结果...

有更好的方法吗?

干杯

标签: javascriptnode.jsarrayspromiseasync-await

解决方案


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相对较新,但编写自定义帮助函数来实现相同的功能应该很容易。


推荐阅读