Node.js在循环中回调麻烦

时间:2017-05-09 14:29:40

标签: node.js express callback snmp

作为Node的新手,我仍然遇到一些回调问题。

mapBpiIfindex函数中,我试图遍历vlans函数找到的所有VLAN。一旦它遍历所有VLAN,创建地图,我想将地图输出到浏览器。但是,我得到的唯一输出是{}。如何将映射发送到浏览器?我甚至不确定我是否正确使用了我的回调。

var express = require('express');
var router = express.Router();
var snmp = require('snmp-native');


// Create a Session with explicit default host, port, and community.
let session = new snmp.Session({ host: 'AASW0120', port: 161, community: 'community' })

let Mibs = {
    hostname: [1,3,6,1,2,1,1,5,0],
    vlans: [1,3,6,1,4,1,9,9,46,1,3,1,1,2],
    dot1dBasePortIfIndex: [1,3,6,1,2,1,17,1,4,1,2]
}


/* Get all VLANs on switch */
function vlans(snmpSession, cb) {
    let vlans = []
    session.getSubtree({ oid: Mibs.vlans }, function (error, varbinds) {
        if (error) {
            console.log('Fail :(');
        } else {
            varbinds.forEach(function (varbind) {
                vlans.push(varbind.oid[varbind.oid.length -1])
            })
        }
        cb(vlans)
    })
}


/* Map BPIs to Ifindices */
function mapBpiIfindex(session, cb) {
    let map = {}
    vlans(session, function (vlans) {
        vlans.forEach(function (vlan) {
            session.getSubtree({oid: Mibs.dot1dBasePortIfIndex, community: 'community@' + vlan}, function (error, varbinds) {
                if (error) {
                    console.log('Fail :(')
                } else {
                    varbinds.forEach(function (varbind) {
                        map[varbind.oid[varbind.oid.length -1]] = {ifindex: varbind.value, vlan: vlan}
                    })
                }
            })
        })
        cb(map)
    })
}



router.get('/vlans', function (req, res, next) {
    vlans(session, function (vlans) {
        res.send(vlans)
    })
})

router.get('/bpi-ifindex', function (req, res, next) {
    mapBpiIfindex(session, function (mapping) {
        res.send(mapping)
    })
})

1 个答案:

答案 0 :(得分:0)

答案是否定的,你没有正确使用它;) 这里有一些事情:

  1. 您应该清楚回调中的代码在操作完成后执行,因此cb(map)不会等到所有循环回调都完成。这就是为什么没有返回的原因(因为当调用cb时,异步函数尚未完成,并且映射值未定义。请查看此How do I return the response from an asynchronous call?,其原理相同。

  2. 查看async模块。具体来说,do *或while方法。它可以帮助您使用异步函数调用来处理循环。

  3. 除此之外,如果您关注表现,请should not use forEach