arp.stdout.pipe(parse).pipe(filter).pipe(through(function(device) {
this.queue(device.mac + '\n');
device_d.push(device.mac);
}));

function CreateList() {
arp.stdout.pipe(parse).pipe(filter).pipe(through(function(device) {
this.queue(device.mac + '\n');
device_d.push(device.mac);
}));
setTimeout(function() {
return device_d;
}, 1000);
}

此代码在返回之前未执行。我总是得到一个空数组。 我只会在
时得到回复arp.stdout.pipe(parse).pipe(filter).pipe(through(function(device)
//{this.queue(device.mac + '\n');device_d.push(device.mac);})); runs synchronously.
答案 0 :(得分:0)
为什么需要setTimeout?在setTimeout内部返回isn&ft; t返回函数CreateList()。它是在setTimeout中创建的函数的返回。
如果你想使用同步功能,你应该使用deasync或类似的东西。
使用npm install deasync
安装deasync并尝试使用此代码,它应该可以正常工作。
function CreateList() {
// variable for blocking loop until return value is ready
var ret = false;
arp.stdout.pipe(parse).pipe(filter).pipe(through(function(device) {
this.queue(device.mac + '\n');
device_d.push(device.mac);
ret = true; // return values is ready, stop waiting loop
}));
while(!ret){
require('deasync').runLoopOnce();
}
return device_d;
}
console.log(CreateList());
然而,在Node.js
中不建议使用阻塞循环和通常的同步功能正确的方法是将此函数转换为异步,如此
function CreateList(callback) {
arp.stdout.pipe(parse).pipe(filter).pipe(through(function(device) {
this.queue(device.mac + '\n');
device_d.push(device.mac);
callback(device_d);
}));
}
CreateList(function(response){
console.log(response);
});
更新:我没有意识到我在原始答案中使用简单循环阻止了同步功能。你应该在循环中使用deasync。