Node.js 来自多个函数的回调
我是nodejs的新手,回拨电话让我头疼。Node.js 来自多个函数的回调,node.js,callback,Node.js,Callback,我是nodejs的新手,回拨电话让我头疼。 我想编写一个应用程序,允许用户选择和查询服务器的某些设备状态(例如ping、cpu、内存等)。要查询的项目将通过URL发送到后端服务器。我使用for循环和开关来调用执行shell命令(例如ssh、ping等)的函数,以获取服务器状态。最后,我想将所有结果(res.write)写入前端。 我无法使它工作,要么返回null,要么处理“结束前写入”错误。。。请帮帮我。 这是我的代码,我试图简化它 app.get('/check', function(req,
我想编写一个应用程序,允许用户选择和查询服务器的某些设备状态(例如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);
});
}
您可以从异步库使用此方法:
您可以从异步库使用此方法:
使用异步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函数:
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);
}
})
checkping
是一个异步函数,您在等待回调完成之前调用它。您需要为每次迭代返回一个承诺,并使用promise.all来等待all完成,然后调用回调函数。checkping
是一个异步函数,您在等待回调完成之前调用它。您需要为每次迭代返回一个承诺,并使用promise.all等待所有操作完成,然后调用回调函数。is async.eachOf与async.forEachOf相同?是的,它只是一个别名is async.eachOf与async.forEachOf相同?是的,它只是一个别名