我正在尝试使用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
所以我的问题是
- 为什么"完成"不被视为功能
- 最终,我想等到VM从异步代码中返回我的结果,那个么这是正确的方法还是更好的方法来实现同样的事情呢
done
未被识别为函数的原因是vm上下文中的this
是全局对象,并且context
属性不是作为全局插入的,而是作为局部上下文变量插入的。