大家好,我正在尝试构建一个 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()
。
查看https://hackernoon.com/concurrency-control-in-promises-with-bluebird-977249520f23了解更多信息。
根据需要编辑以下代码,但这是一个粗略的轮廓
// 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 的多线程请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167269/