Tob*_*obi 6 node.js async-await babeljs ecmascript-2016
我正在尝试实现一种在 Node.js VM 中运行“顺序编写”异步 JS 代码并获取对相应上下文对象的访问权限的方法。我尝试使用即将到来的 ES7await功能,由babel.js.
在我看来,script.runInContext()在后台运行,而主循环继续,因此我无法从虚拟机的上下文中获取结果。
我的示例代码如下:
var vm = require('vm');
var request = require('request-promise');
var babel = require("babel-core");
// VM context object
var contextCache = {
context: {
request: request
}
};
// ES 7 code
var code = "var res = await request('http://www.google.de')";
// Wrap the code
code = "(async function() { " + code + " })()";
// Transpile code ES7 -> ES5
var regeneratedCode = babel.transform(code, { "ast": false, "presets": ["stage-0"] }).code
// Create VM context
var vmContext = new vm.createContext(contextCache.context);
// Create virtual script
var script = new vm.Script(regeneratedCode);
// Run script
script.runInContext(vmContext, {displayErrors: true, timeout: 30000});
// Check if variable was set -> Is undefined
console.log(contextCache.context.res);
Run Code Online (Sandbox Code Playgroud)
有没有办法以同步方式从上下文评估中检索异步结果?
参考:
我找到了一种方法来实现这个工作......基本上它是使用this执行代码中上下文对象的变量,并从内部调用回调函数作为最后一个操作:
var vm = require('vm');
var babel = require("babel-core");
// VM context object
var context = {
require: require,
callback: function(error) {
if (error) {
console.log(error.stack);
} else {
console.log(this.response);
}
}
};
// ES 7 code
var code = "var request = require('request-promise'); var response = await request({ url: 'https://graph.facebook.com/?id=http://news.ycombinator.com', json: true })";
// Wrap the code
code = "'use strict'; async function run() { try { " + code.replace(/var /g, "this.") + "; this.callback(null); } catch(error) { this.callback(error); } }; run.apply(this)";
// Transpile code ES7 -> ES5
var regeneratedCode = babel.transform(code, { "ast": false, "presets": ["stage-0"] }).code;
// Create VM context
var vmContext = new vm.createContext(context);
// Create virtual script
var script = new vm.Script(regeneratedCode);
// Run script
script.runInContext(vmContext, {displayErrors: true, timeout: 30000});
Run Code Online (Sandbox Code Playgroud)