【问题标题】:callback from multiple functions多个函数的回调
【发布时间】:2018-02-05 10:31:23
【问题描述】:

我是 nodejs 的新手,我对回调感到头疼..
我想编写一个应用程序,允许用户选择和查询服务器的某些设备状态(例如 ping、cpu、内存等)。要查询的项目将通过 URL 发送到后端服务器。我使用了一个 for 循环和一个开关来调用执行 shell 命令的函数(例如 ssh、ping 等)以获取服务器状态。最后,我想将所有结果(res.write)写入前端。
我未能使其工作,要么返回 null 要么接近“结束前写入”错误......请帮助我。 这是我的代码,我试图简化它。

app.get('/check', function(req, res, next) {
    var selecteditems = req.query.selecteditems; //ping,memory,disks,etc. 
    checkcon(selecteditems, function(results) {
        res.write(JSON.stringify(results), function(err) {
            res.end();
        });
    });
});

var checkcon = function(selecteditems, callback) {
    var selecteditems = selecteditems.split(',');
    var allresults = [];
    selecteditems.forEach(function(entry) {
        switch (entry) {
            case "ping":
                checkping(function(results) {
                    allresults.push(results);
                });

                break;
            case "memory":
                checkmemory(function(results) {
                    allresults.push(results);
                });
                break;
            case "disks":
                checkdisks(function(results) {
                    allresults.push(results);
                });
                break;
            case "disks":
                break
            default:
        }
        callback(allresults);
    });
}

shell命令的功能之一示例:

var checkping = function(callback) {
    var pingstat = [];
        const child = exec('ping -c 1 -W 1 10.102.12.2',
            (error, stdout, stderr) => {
                if (error !== null) {
                    console.log(`exec error: ${error}`);
                    pingstat.push("Unable to ping machine");
                } else {
                    pingstat.push("OK");
                }
                callback(pingstat);

            });
}

【问题讨论】:

  • checkping 是一个异步函数,您在等待它完成之前调用回调。您需要为每次迭代返回一个 Promise 并使用 Promise.all 等待 all 完成,然后调用回调函数。

标签: node.js callback


【解决方案1】:

使用 async eachOf,以便循环数组并对每个元素应用异步函数:

var selecteditems   = selecteditems.split(',');
var allresults      = [];

async.eachOf(selecteditems, function(item, index, cb){

     switch (item) {
        case "ping":
            checkping(function(results) {
                allresults.push(results);
                return cb();
            });

            break;
        case "memory":
            checkmemory(function(results) {
                allresults.push(results);
                return cb();
            });
            break;
        case "disks":
            checkdisks(function(results) {
                allresults.push(results);
                return cb();
            });
            break;
        case "disks":
            return cb();
            break
        default:
            return cb();
     }

}, function(err){
   if(err)
   {
        // do stg
    }
    else
    {
         callback(allresults);
    }
})

【讨论】:

  • async.eachOf 和 async.forEachOf 一样吗?
  • 是的,它只是一个别名
【解决方案2】:

你可以使用异步库中的这个方法: https://caolan.github.io/async/docs.html#reduce

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多