在nodejs中同步运行一个函数

时间:2015-12-02 11:33:38

标签: node.js asynchronous synchronization



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.

1 个答案:

答案 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。