首页 > 解决方案 > 保存回调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 但它不能解决我的问题

标签: javascriptnode.js

解决方案


不能将异步数据(例如dataparsed等)拉入同步上下文。想一想:通过将回调传递给connection.connect()您是在告诉它“在将来某个不确定的时间,当您完成连接时调用此函数”,然后代码会立即继续并console.log(toto)在回调执行之前相对较远地命中。在该回调中创建的数据无法及时返回。

如果您想编写异步代码,就好像它是同步的一样,请使用async/await - 您正在使用的库似乎支持 promises,因此您必须使用这些函数来做到这一点。


推荐阅读