JS调用mikronode执行ping后如何将返回JSON数据从主函数返回使用
实现方案
你的问题核心是代码中涉及的设备连接、ping请求都属于异步操作,执行顺序晚于普通的同步return逻辑,所以没法直接把结果同步返回给外部使用,需要用Promise封装异步结果后配合.then()或者async/await调用获取返回值,改造方式如下:
1 改造tbotping函数,封装为Promise返回
将整个逻辑包裹在Promise实例中返回,拿到ping结果时调用resolve传出数据,出现异常时调用reject抛出错误:
function tbotping () { return new Promise((resolve, reject) => { var MikroNode = require('mikronode'); var device = new MikroNode('IP'); //device.setDebug(MikroNode.DEBUG); device.connect() .then(([login])=>login('username','password')) .then(function(conn) { conn.closeOnDone(true); var ping = conn.openChannel(); ping.closeOnDone(true); console.log('Get ping'); ping.write('/ping',{'address':'77.88.8.8','count':'3'}); ping.data .subscribe(function (data) { // 拿到结果后向外传出,可直接传原始data对象,也可传序列化后的JSON字符串 var myJSON = JSON.stringify(data); console.log(myJSON); resolve(myJSON); }, (subscribeErr) => { // ping订阅出错时抛出异常 reject(subscribeErr) }); }) .catch(connectErr => { // 连接、登录过程出错时抛出异常 reject(connectErr) }) }) };
2 外部调用获取返回值
有两种常用的调用方式可以拿到返回结果:
- 方式1:用
.then()链式调用
tbotping() .then(pingResult => { // pingResult就是你需要的myJSON,可直接在这个作用域内使用 console.log('外部获取到的ping结果:', pingResult) // 如果需要对字段做操作,可转成JS对象 const pingData = JSON.parse(pingResult) // 示例:取平均延迟、丢包率字段,可根据你实际返回的字段调整 console.log('平均延迟:', pingData['avg-rtt'], '丢包率:', pingData['packet-loss']) }) .catch(err => { console.error('执行出错:', err) })
- 方式2:在async函数内用await调用(写法更简洁)
async function main() { try { const pingResult = await tbotping() const pingData = JSON.parse(pingResult) // 此处可直接使用返回的结果 console.log('发送包数:', pingData['sent'], '接收包数:', pingData['received']) } catch (err) { console.error('执行出错:', err) } } // 执行入口函数 main()
内容的提问来源于stack exchange,提问作者imPPLs
相关产品推荐
相关产品推荐

