Javascript 如何从承诺函数返回值
我有一个功能,可以检查设备是否在线。下面是代码Javascript 如何从承诺函数返回值,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我有一个功能,可以检查设备是否在线。下面是代码 const ping=require('ping'); 导出功能查找设备(设备){ 试一试{ const hosts=[设备]; 设result=null; hosts.forEach((主机)=>{ ping.promise.probe(主机) 。然后((res)=>{ console.log(res.alive) 结果=res.alive; 返回{ 状态:结果 } }); }); }捕捉(错误){ 错误(err,“[config-findDev
const ping=require('ping');
导出功能查找设备(设备){
试一试{
const hosts=[设备];
设result=null;
hosts.forEach((主机)=>{
ping.promise.probe(主机)
。然后((res)=>{
console.log(res.alive)
结果=res.alive;
返回{
状态:结果
}
});
});
}捕捉(错误){
错误(err,“[config-findDevices()]”);
控制台错误(err);
返回{
状态:“失败”
}
}
}
我在redux操作中调用此函数,如下所示:
导出功能启动(设备){
返回调度=>{
const status=连接状态findDevices(设备);
退货({
类型:actionTypes.CONNECTIONSTATUS,
有效载荷:{
连接状态:状态
}
})
};
}
我期望状态变量为true或false。但是我得到了未定义的结果,即使我返回了promise函数中的值。我试着等待这个电话,但仍然不起作用。任何帮助都将不胜感激。谢谢。如果是这样的话,你可以这样做
const getStatus = async () => {
try {
const hosts = [device];
const promises = [];
hosts.forEach((host) => {
promises.push(ping.promise.probe(host));
});
const result = await Promise.all(promises);
const status = result.map((r) => { return r.alive; });
return status;
} catch (err) {
logger.error(err, '[ config - findDevices() ]');
return { status: 'Failed' };
}
};
不是100%确定所有变量都是什么,但是您是否考虑过使用
async/await
来简化类似的事情
const getStatus122 = async device => {
return await Promise.all([device].map(ping.promise.probe))
.then(({ alive }) => alive)
.then(Status => ({ Status }))
.catch(error => {
logger.error(error, '[ config - findDevices() ]');
return { Status: 'Failed' };
})
}
这里有更多信息:有了承诺,您应该在
when
或catch
回调函数中检查承诺的结果。使用async/await,代码看起来可能会简单一些。这是一个明确承诺的版本
const ping = require('ping');
const Connectionstatus = {
findDevices: (device) => {
return ping.promise.probe(device).then((res) => {
const result = res.alive;
console.log(result);
return {
Status: result,
};
}).catch((err) => {
logger.error(err, '[ config - findDevices() ]');
console.error(err);
return {
Status: "failed"
}
});
}
}
export function start(device) {
return dispatch => {
Connectionstatus.
findDevices(device).
then((status) => {
dispatch({
type: actionTypes.CONNECTIONSTATUS,
payload: {
ConnectionStatus: status
}
})
});
};
}
您可能会看到错误处理移动到了
catch
回调函数,而分派是在then
回调函数中完成的。这就是您问题的答案。您必须在then()
块之外返回结果。这应该管用,我也试过了。它返回null;为什么在循环中调用承诺若有多个主机,我应该返回每个主机的状态。这就是为什么。您可能希望查看将主机
数组映射到所有be承诺,并使用Promise.all()
解析所有这些承诺。