2013-02-14 1 views
3

방금 ​​coffeescript로 시작했는데 좋았지 만 좌절스러운 문제가있었습니다. 내가 프로세스와 자바 스크립트에서 분기 된 자식 프로세스 사이에 메시지를 보내고받는 기본 버전을 재현 할 때 나는 예상 된 결과를 얻는다. 지금까지는 모든 것이 좋습니다.CoffeeScript에서 child_process.send를 사용할 때 메시지가 누락되었습니다.

----------- app2.js -----------------------------

var child = require('child_process'); 
var forked = child.fork("./child2.js"); 

forked.on('message', function (msg) { 
    console.log("parent recieved ", msg); 
}); 

forked.send({hello:'world'}); 

---------- child2.js --------------------------------

나는 커피 스크립트의 예를 재현 할 때 노드의

-------------- 출력 아직 -----

child received { hello: 'world' } 
parent recieved { foo: 'bar' } 

을 을 app2.js

process.on('message', function(m) { 
    console.log("child received ", m); 
}); 

process.send({foo:'bar'}); 
, 난 단지 얻을 부모가 자식 프로세스로부터의 메시지; 자식 프로세스는 분명히 부모로부터 메시지를받지 못합니다.

-----------app.coffee ----------------------------

cp = require('child_process') 
n = cp.fork("./child.coffee") 

n.on 'message', (m) => 
    console.log 'PARENT recieved', m 

n.send {foo:'hello from the parent process'} 

---------- child.coffee ---------------------------

process.on 'message', (m) => 
    console.log 'CHILD received ', m 

console.log "Child process running" 

process.send {bar:'hello from the child process'} 

-------------------- coffee app.coffee의 출력 ----

컴파일 된 자바 스크립트를 보면 (예상대로) 공동의 결과 coffeescript를 mpiling하는 것은 본질적으로 원래의 자바 스크립트 코드와 동일합니다. 그냥이 함수를 호출하는 함수로 래핑됩니다. 문제는 범위 중 하나 여야하지만, 나는 그것을 재구성하는 방법을 볼 수 없다. 그것은 전문가에게는 사소한 일이 될 것이 틀림 없으며, 나는 그것에 묶여있는 끈의 끝 부분에 있습니다. 그래서 나는 누군가가 친절하게 나를 보여줄 수 있을지 물어볼 것이라고 생각했습니다.

Dr Darryn Reid.

답변

5

불행히도 이것은 범위 지정 문제만큼 간단하지 않습니다. 문제는 JS 케이스에서 새로운 node 프로세스를 시작하고 CoffeeScript의 경우 새 coffee 프로세스를 시작하는 fork 명령입니다.

많은 사냥을하지 않고도 말할 수는 없지만 시작/컴파일 시간이나 그와 관련된 것의 차이점이 있습니다.

// Changing this line 
n.send {foo:'hello from the parent process'} 

// to this works for me 
setTimeout (-> n.send {foo:'hello from the parent process'}), 300 

나는 당신을위한 간단한 솔루션을 사용하면 자식 프로세스에서 일부 초기 'ready' 이벤트를받은 때까지 아이에게 어떤 메시지를 보낼 수 없습니다하는 것입니다 생각합니다. 따라서 child.coffee은 부모 프로세스에게 마지막으로 컴파일되어 완전히로드되었다는 것을 알리는 초기 메시지를 보낼 수 있습니다.

+0

조언을 주셔서 감사합니다. 나는 그것이 "비동기 적으로 생각한다"고 생각한다. 나는 node.js에 대한 문서가 정말로 더 튼튼하게 변해야한다고 생각한다. 부모 프로세스가 자식으로부터 메시지를받은 후에 만 ​​메시지를 보내는 것만으로도 많은 변화가 없습니다. 다시 한번 감사드립니다. – user2073604

관련 문제