javascript - 保存回调nodejs的返回
问题描述
我正在研究 mikrotik 路由器的 router-os 库。我无法在回调之外显示对 API 的调用。foo 变量应该只包含 API 中的对象恢复 我无法解决异步问题
var MikroNode = require('mikronode-ng2');
const USER = "sofian";
const PASSWD = "sofian"
var toto;
var connection = MikroNode.getConnection('10.0.0.1', USER, PASSWD)
connection.connect(function (conn) {
var chan = conn.openChannel();
conn.closeOnDone = true;
chan.write('/ip/address/print', function () {
chan.closeOnDone = true;
chan.on('done', function (data) {
var parsed = MikroNode.parseItems(data);
toto = parsed
parsed.forEach(function (item) {
console.log('Interface/IP: ' + item.interface + "/" + item.address);
})
})
})
})
console.log(toto);
返回终端:
undefined
Interface/IP: Lan/10.0.0.1/8
Interface/IP: Wan Orange/192.168.1.254/24
谢谢
编辑承诺:
我试了一下,还是不行
var MikroNode = require('mikronode-ng2');
const USER = "sofian";
const PASSWD = "sofian"
var connection = MikroNode.getConnection('10.0.0.1', USER, PASSWD)
var result;
function test() {
connection.getConnectPromise().then( function (conn) {
conn.getCommandPromise('/ip/address/print').then(async function resolved(values) {
// console.log('Addreses: ' + JSON.stringify(values));
result = 'Addreses: ' + JSON.stringify(values)
return await result;
})
})
}
console.log(test())
终端 :
undefined
我添加了 async / await 但它不能解决我的问题
解决方案
您不能将异步数据(例如data
、parsed
等)拉入同步上下文。想一想:通过将回调传递给connection.connect()
您是在告诉它“在将来某个不确定的时间,当您完成连接时调用此函数”,然后代码会立即继续并console.log(toto)
在回调执行之前相对较远地命中。在该回调中创建的数据无法及时返回。
如果您想编写异步代码,就好像它是同步的一样,请使用async/await - 您正在使用的库似乎支持 promises,因此您必须使用这些函数来做到这一点。
推荐阅读
- mongodb - 无法从 3.6 -> 4.0 升级 Mongodb 副本集(Wire 版本不兼容)
- c# - C# JSON 数组按键获取值,每个循环中没有强类型类
- php - 更新记录时从空值创建默认对象
- apache-spark - 如何定义 Spark UI 和驱动程序日志 URL,以便它们直接访问我的代理而不是 spark master
- c# - 统一使用颜色数据类型
- aws-sdk-js - node.js aws-sdk 使用名称中的空格访问 S3 目录
- powershell - 在 powershell 脚本中捕获 Snowsql 返回代码
- node.js - 可能不存在的字段上的“orderBy”完全跳过文档
- npm - 在 Yarn 中设置自定义注册表似乎不起作用
- matplotlib - 禁止在metpy中打印轴标签