2013-03-20 25 views
14

Tôi đang cố gắng trả về đầu ra của hàm này dưới dạng một chuỗi, nhưng nó tiếp tục trả về dưới dạng không xác định. Tôi làm sai ở đâu?Node.js: Viết một hàm để trả về stawn xuất hiện dưới dạng chuỗi

function run(cmd){ 
    var spawn = require('child_process').spawn; 
    var command = spawn(cmd); 
    var result = ''; 
    command.stdout.on('data', function(data) { 
      result += data.toString(); 
    }); 
    command.on('close', function(code) { 
      return result; 
    }); 
} 
console.log(run('ls')); 

Trả lời

25

Chức năng của bạn sẽ trả về ngay lập tức sau tuyên bố command.on. Tuyên bố return trong cuộc gọi lại của bạn cho sự kiện close được trả về hư không. return thuộc về gọi lại sự kiện, không phải là run().

Đặt console.log cuộc gọi thay vì return result.

Nói chung bạn nên viết một cái gì đó như:

function run(cmd, callback) { 
    var spawn = require('child_process').spawn; 
    var command = spawn(cmd); 
    var result = ''; 
    command.stdout.on('data', function(data) { 
     result += data.toString(); 
    }); 
    command.on('close', function(code) { 
     return callback(result); 
    }); 
} 

run("ls", function(result) { console.log(result) }); 
+0

Cảm ơn! Làm thế nào tôi sẽ thay đổi nó để có chức năng đầu ra cho một biến thay vì console.log? –

+1

Bạn nên làm bất cứ điều gì bạn phải làm với kết quả lệnh trong chức năng gọi lại, chỉ cần thay thế console.log bằng mã thực. Tất cả mọi thứ là không đồng bộ, vì vậy ngay cả khi bạn cố gắng đặt giá trị kết quả trong một biến toàn cục, bạn không thể biết khi nào nó sẽ có sẵn. Nếu bạn thực sự muốn làm điều gì đó theo cách không đồng bộ, điều này có thể giúp: https://github.com/caolan/async#series. Nhưng hãy tự hỏi tại sao bạn muốn làm điều đó. – fuwaneko

+0

Waaaah Tôi rất ngớ ngẩn. Đã giải quyết lời hứa của tôi trên 'child.stdout.on ('dữ liệu', dữ liệu)' và tự hỏi tại sao đầu ra của tôi không hoàn chỉnh và được cắt ngắn ngẫu nhiên. Nếu bạn gặp phải sự cố đó, hãy lưu trữ dữ liệu vào một biến đầu tiên được giải quyết/bị từ chối bên trong sự kiện 'child.on ('close')' như trong câu trả lời này. Cảm ơn @ fuwaneko – GrayedFox

4
var spawn = require('child_process').spawn, 
    command = spawn('ls', ['/tmp/']); 
command.stdout.pipe(process.stdout); 

Sau đây link là chính xác cùng một câu hỏi như bạn.

+0

thông minh, nhưng ông có thể muốn làm moer sau đó chỉ cần in kết quả để process.stdout – mkoryak

+1

Cảm ơn cho câu trả lời. Làm cách nào để lưu trữ stdout.pipe vào một biến? –

+0

Hãy xem https://gist.github.com/pguillory/729616 là những gì bạn muốn. – Marcel

Các vấn đề liên quan