2014-04-18 4 views
1

저는 초보자 프로그래밍을 가르치는 사이트를 만들고 있습니다. 편집기에서 코드를 작성하고 실행 버튼을 클릭하면 웹 작업자가 상속 코드를 실행하기 시작합니다.웹 작업자를위한 사용자 코드를 확인하고 묻습니다.

the comments for this question에 대답했습니다. eval()을 사용할 수 없습니다.

내 질문은 지금, alert(), prompt()confirm() 대화 상자가 잘 작동하는 기능을 정의했습니다. 그러나 후자의 반환 값은 웹 작업자에게 반환되지 않습니다. return을 추가하더라도 Cannot read property 'toString' of undefined이 반환 값을 처리하도록 코드를 수정할 수 있습니까?

전체 코드 :

var userCode = editor.getValue(); 
     // append functions and variables for drawing on Canvas 
var codeWithMessages = '\n\ 
    function print (data) { postMessage(["print", data.toString()]); } \n\ 
    function println(data) { postMessage(["print", data.toString() + "\\n"]); } \n\ 
    function alert (data) { postMessage(["alert", data.toString()]); } \n\ 
    function confirm(data) { return postMessage(["confirm", data.toString()]); } \n\ 
    function prompt (data) { return postMessage(["prompt", data.toString()]); } \n\ 
    \n\ 
    ... 
' + userCode; 
     var codeWithMessagesAndExitValues = codeWithMessages + "..." 

    // handle messages, calling window functions or exit and handle user return vars 
    outer.worker.addEventListener('message', function (event) { 
     var method = event.data[0] || null; 
     var data = event.data[1] || null; 


     if (method == "canvas") { 
      // call canvas methods 
     } 
     else if(method == "exit") { 
      // close the worker and handle user variables 
     } 
     else if(method == "alert") { 
      alert(data); 
     } 
     else if(method == "confirm") { 
      confirm(data); 
     } 
     else if(method == "prompt") { 
      prompt(data); 
     } 
     else if(method == "print") { 
      if ($("#run-output").text() == editorController.noOutputMsg) 
       $("#run-output").text(""); 
      $("#run-output").append(data); 
     } 
사용자 코드의

최소 예 :

print(prompt("Enter your name:")); 

(아무것도 입력하면 위의 오류를 줄 것이다)

http://pastebin.com/bnE128DE

관련 부분이 runCode() 방법에

+1

코드를 인터넷에 다른 위치에 배치하는 대신 코드의 해당 부분을 질문에 게시하십시오. – Bergi

+0

어쨌든 비동기 메시지에서 동 기적으로'return '할 수 없습니다. – Bergi

+0

관련 부분은 상당히 긴'runCode()'메소드에 있습니다. 나는 그것을 지금 무너 뜨리려고 노력하는 것에 그것을 줬다. –

답변

1

난 당신이 메시지없이 인 - webworker prompt/confirm 방법이라고처럼 dataundefined이되도록, 보이는 Cannot read property 'toString' of undefined

를 얻을. 그러나 사용 된 코드 샘플 및 예외의 행 번호 없이는 말할 수 없습니다.

후자의 두 가지의 반환 값

은 왜 것, 웹 노동자

음에 반환되지 않습니다? 메시지 이벤트 처리기조차도 반환 값으로 아무 것도 시도하지 않습니다.

반환 값을 처리하도록 코드를 수정할 수 있습니까?

아니요. 작업자 통신이 비동기 적이기 때문에 메시지의 값 return을 동기화 할 수 없습니다.

+0

최소한의 사용자 코드 샘플로 질문을 업데이트했습니다. 나는 postMessage 호출 전에 return 문을 추가하더라도 메시지를 받는다는 것을 잊었다. –

+0

'prompt()'는'postMessage()'를 반환합니다'undefined'를 반환합니다 (비동기식이고 메시지에 "응답"이 없기 때문에) 그리고 그것은'print (undefined)'를 호출하는 것입니다. 'data'가'undefined'라는 에러를 던집니다. – Bergi

+0

나는 그것을 이해했다. 나는 완전성을 위해 질문을 업데이트했다. 아무도 추가 할 사람이 없다면 몇 시간 후에이 질문에 답을 표시 할 것입니다. –