2015-12-02 52 views
-1

中的NodeJS

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

你究竟在問什麼? – MrHug

+0

這是一個問題或答案? – Technotronic

回答

0

爲什麼你需要setTimeout的反應?在函數CreateList()中,setTimeout不返回setTimeout。這是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。