2016-03-30 5 views
0

私はnodejs vmでいくつかの例を試しています。以下のLOCを参照してください。NodeJS VMはコールバックを呼び出していませんか?同じことをする他の方法?

var vm = require('vm'); 
var jsonObject = { 
    "yahoo" : 200 
} 

var context = { 
    jsonObjectToPopulate: jsonObject, 
    result: null, // this will be populated in code execution 
    setTimeout : setTimeout, 
    done : function(){ 
     console.log(context.result); 
    }, 
    next : function(data){ 
     console.log('data = '+data); 
     this.result = data; 
     this.done(); 
    } 
}; 

var jsCode = "var customFun = function(jsonObjectToPopulate){ " + 
           "setTimeout(function(){" + 
            "next(300)}, 3000);" + 
           "};" + 
           "customFun(jsonObjectToPopulate);"; 
vm.runInNewContext(jsCode, context); 

とログです

data = 300 
/Users/alokguha/dev/microflow/issues/1717/nodetest/vm/vmTest.js:21 
     this.done(); 
      ^

TypeError: this.done is not a function 
    at context.next (/Users/alokguha/dev/microflow/issues/1717/nodetest/vm/vmTest.js:21:14) 
    at null._onTimeout (evalmachine.<anonymous>:1:56) 
    at Timer.listOnTimeout (timers.js:89:15) 

ノードバージョン:v4.0.0

ので、私の質問は

  1. なぜ "完了" を関数として認識されないされていますか?
  2. 最終的に私はVMが私に非同期コードからの結果を返すまで待つことを望んでいます。それで、同じことを達成するための正しいやり方です。

答えて

1

VMコンテキスト内部thisがグローバルオブジェクトであり、context特性はグローバルとしてではなく、ローカルコンテキスト変数として挿入されていないため、doneを関数として認識されないことが理由です。

+0

アプローチはどうですか?このような問題を解決する正しい方法だと思いますか? –

関連する問題