2015-01-20 7 views
5

चलो कहते हैं कि मैं एक parent.js एक विधि parentNode.js में बाल प्रक्रिया में फ़ंक्शन/कॉलबैक कैसे पास करें?

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(); 
    }); 
} 

नामित युक्त है 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 
     }); 
    }); 
}); 

इस बीच में मैं सोच रहा था चलो अगर बच्चे की प्रक्रिया के लिए कार्यों गुजर Node.js. में अनुमति नहीं है

asyncFnundefinedchild पर भेजे जाने के बाद क्यों होगा?

क्या यह JSON.stringify से संबंधित है?

उत्तर

6

जेएसओएन धारावाहिक कार्यों (कम से कम बॉक्स के बाहर) का समर्थन नहीं करता है। आप फ़ंक्शन को इसके स्ट्रिंग प्रस्तुति में पहले परिवर्तित कर सकते हैं (asyncFn.toString() के माध्यम से) और फिर बच्चे की प्रक्रिया में फिर से फ़ंक्शन को फिर से बनाएं। समस्या यह है कि आप इस प्रक्रिया के साथ गुंजाइश और संदर्भ खो देते हैं, इसलिए आपका कार्य वास्तव में स्टैंडअलोन होना चाहिए।

पूरा उदाहरण:

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

ओह, मुझे यह करने के लिए हराया: पी – loganfsmyth

+0

'नया समारोह है ('वापसी' + funcString)() अविश्वसनीय कोड के लिए सुरक्षित? – M4GNV5

+0

@ एम 4 जीएनवी 5 नहीं, आपको "अविश्वसनीय कोड" के साथ सुरक्षित होने के लिए उपयुक्त ओएस-स्तरीय सुरक्षा के साथ बच्चे की प्रक्रिया में 'vm' मॉड्यूल का उपयोग करने की आवश्यकता होगी। – mscdex

संबंधित मुद्दे