基于Javascript的多线程请求

基于Javascript的多线程请求,javascript,multithreading,reactjs,Javascript,Multithreading,Reactjs,大家好,我正在尝试构建一个ReactJS应用程序,用于控制和监视某些物理设备的状态。为了获取这些物理设备的状态,我使用了如下请求: axios.get('http://192.168.1.***:8080').then( response => { let deviceStatusMode = 0; if(response.data.isCritical) { deviceStatusMode = 1; } else if (response.dat

大家好,我正在尝试构建一个ReactJS应用程序,用于控制和监视某些物理设备的状态。为了获取这些物理设备的状态,我使用了如下请求:

axios.get('http://192.168.1.***:8080').then( response => {
    let deviceStatusMode = 0;
    if(response.data.isCritical) {
        deviceStatusMode = 1;
    } else if (response.data.isWarning) {
        deviceStatusMode = 2;
    } else {
        deviceStatusMode = 3;
    }
    let opvObj = {
        "odv1" : deviceStatusMode,
        "odv2" : 2,
        "odv3" : 3
    }
    store.dispatch(odvStatus(opvObj));
});
此请求需要发送到多个设备(接近9-10个)。然而,它们中的一些将被关闭,其中的一些可能无法响应,那么,避免等待此请求超时并通过多线程方法合并它们的最佳方法是什么?谢谢

关于JS中的“并发性”,请查看使用
Promise.all()

查看更多信息

根据需要编辑下面的代码,但这里有一个粗略的轮廓

// assuming these are your devices
const devices = [1, 2, 3, 4, 5, 6, 7, 8, 9]

(async () => {
    // These were then passed to Promise.all() to be executed in parallel. 
    let opvObj = {};
    await Promise.all(devices.map(async (device) => {
        axios.get('http://192.168.1.***:8080')
            .then(response => {
                let deviceStatusMode = 0;
                if (response.data.isCritical) {
                    deviceStatusMode = 1;
                } else if (response.data.isWarning) {
                    deviceStatusMode = 2;
                } else {
                    deviceStatusMode = 3;
                }
                // build up opvObj
                opvObj[`odv${device}`] = deviceStatusMode;
            })
            .catch(error => {
                // do something with the error
                console.log(error)
            });
    }));
    //dispatch 
    store.dispatch(odvStatus(opvObj));
})()

javascript中没有真正的多线程概念——所有的执行都发生在单个线程上。然而,由于javascript有一个异步事件循环,我们仍然可以互操作代码的不同部分,而无需等待任何http请求完成

因为看起来您正在使用redux,所以您所要做的就是保留与现在相同的代码,只是您应该以增量方式更新状态(即,一次只更新“odv1”而不是“odv1”-“odv3”。再看一看文档,了解如何做到这一点

然后,您可以运行make多个
axios.get
调用,它们不会因为javascript的异步特性而相互阻塞(即http请求将同时进行,而不是严格按顺序执行):

axios.get('/dev1')。然后(…);
get('/dev2')。然后(…);
get('/dev3')。然后(…);
get('/dev4')。然后(…);
get('/dev5')。然后(…);
有关更多信息,请查看有关的详细信息

如果您真的需要在主gui线程之外执行某些操作(即,如果您有10000多个设备状态需要一秒一秒地保持最新),您可以签出。但是,根据您共享的内容,我认为这将引入比您的项目所需更复杂的操作

编辑:


上面的一个答案提出了
Promise.all
。而我喜欢他使用
Promise将核心逻辑提取到自己的函数中的方法。all
只是将所有的承诺组合成一个。这仍然会导致您必须等到最慢的设备响应后,才能更新几乎是def的存储首先,这不是您想要的。同样,在http请求返回时对redux存储执行增量更新几乎肯定是将最新信息发送到用户屏幕的最快方式。

您可以在请求配置中定义超时阈值,并在失败时使用catch执行操作。除此之外,不是100%清楚你在寻找什么。你想知道他们什么时候都完成了吗?首先,我很高兴你的方法和答案,对于你的问题,是的。我想为所有设备等待最多5秒钟,然后我想收集结果,如果一些请求超时,我会将它们标记为关闭,并在G上显示UI.Axios文档展示了如何配置超时阈值对于超时或失败的线程,需要一个
catch
,这是一个很好的方法,谢谢。但是我认为还有一个问题。我必须将这些请求发送到不同的IP。这就是为什么我标记为“*”。那么可以正确控制线程IP DeviceNumber trio吗?@I.K.你可以吗uld可以从设备阵列中获取该信息,并访问
map()
@I.K.中的每个实例。您可以在
devices
中提取该信息,并使用map callback中的
device
来填充iP贪婪。您可以使用两者的组合来获得最佳结果。