2015-01-20 16 views
5

ı parentNode.js'de işlev/geri çağrı alt süreçlere nasıl aktarılır? Çocuk prosese fonksiyonlarını geçen Node.js. izin değilse

var childProcess = require('child_process'); 

var options = { 
    someData: {a:1, b:2, c:3}, 
    asyncFn: function (data, callback) { /*do other async stuff here*/ } 
}; 

function Parent(options, callback) { 
    var child = childProcess.fork('./child'); 
    child.send({ 
     method: method, 
     options: options 
    }); 
    child.on('message', function(data){ 
     callback(data,err, data,result); 
     child.kill(); 
    }); 
} 

adında bir yöntemi içeren bir parent.js var merak ediyorum Bu arada içinde child.js

process.on('message', function(data){ 
    var method = data.method; 
    var options = data.options; 
    var someData = options.someData; 
    var asyncFn = options.asyncFn; // asyncFn is undefined at here 
    asyncFn(someData, function(err, result){ 
     process.send({ 
      err: err, 
      result: result 
     }); 
    }); 
}); 

diyelim

Neden asyncFn neden child gönderilir?

JSON.stringify ile ilişkili midir?

cevap

6

JSON, serileştirme işlevlerini desteklemez (en azından kutunun dışında). İşlevi ilk başta (asyncFn.toString() aracılığıyla) dize temsiline dönüştürebilir ve daha sonra alt işlemdeki işlevi yeniden yaratabilirsiniz. Sorun, bu süreçle kapsamı ve bağlamı kaybetmenizdir, bu yüzden işlevin gerçekten bağımsız olması gerekir.

Komple örnek:

parent.js:

var childProcess = require('child_process'); 

var options = { 
    someData: {a:1, b:2, c:3}, 
    asyncFn: function (data, callback) { /*do other async stuff here*/ } 
}; 
options.asyncFn = options.asyncFn.toString(); 

function Parent(options, callback) { 
    var child = childProcess.fork('./child'); 
    child.send({ 
    method: method, 
    options: options 
    }); 
    child.on('message', function(data){ 
    callback(data,err, data,result); 
    child.kill(); 
    }); 
} 

child.js:

process.on('message', function(data){ 
    var method = data.method; 
    var options = data.options; 
    var someData = options.someData; 
    var asyncFn = new Function('return ' + options.asyncFn)(); 
    asyncFn(someData, function(err, result){ 
    process.send({ 
     err: err, 
     result: result 
    }); 
    }); 
}); 
+0

Yapma be beni alt: P – loganfsmyth

+0

'yeni Fonksiyon olan ('dönüş' + funcString)() Güvenilmeyen kod için güvenli? – M4GNV5

+0

@ M4GNV5 Hayır, "vm" modülünü "güvenilmeyen kod" ile güvende olmak için uygun işletim seviyesindeki korumalarla bir çocuk işleminde kullanmanız gerekmeyecek. – mscdex

İlgili konular