NodeJS虚拟机没有调用回调?做同样事情的任何其他方式



我正在尝试使用nodejs-vm的一些示例,请参阅以下LOC。

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从异步代码中返回我的结果,那个么这是正确的方法还是更好的方法来实现同样的事情呢

done未被识别为函数的原因是vm上下文中的this是全局对象,并且context属性不是作为全局插入的,而是作为局部上下文变量插入的。

相关内容

最新更新