node.js - 如何使用 ES7 语法从 Node.js VM 脚本检索异步结果

标签 node.js async-await babeljs ecmascript-2016

我正在尝试实现一种在 Node.js VM 中运行“顺序编写的”异步 JS 代码并获得对相应上下文对象的访问权限的方法。我尝试使用即将到来的 ES7 await 功能,由 babel.js 转译。

在我看来,script.runInContext()在后台运行,而主循环继续,因此我无法从 VM 的上下文中获取结果。

我的示例代码如下:

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);

有没有办法以同步方式从上下文评估中检索异步结果?

引用资料:

最佳答案

我找到了一种让它工作的方法...基本上它是在执行的代码中使用 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});

关于node.js - 如何使用 ES7 语法从 Node.js VM 脚本检索异步结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160216/

相关文章:

javascript - 尽管有几个 `try` -`catch` block ,但获取 UnhandledPromiseRejectionWarning

javascript - Webpack 错误无法解析 JSX

javascript - 需要用 gulp 延迟加载 ES6 模块

node.js - 如何在 Express 中使用比较运算符过滤查询字符串

javascript - 如何使用 Node.js 通过代理发送 HTTP/2 请求?

node.js - [tokio-rs] [文档]具有共享状态示例的多个异步 “sub-apps”?

reactjs - 将 JS 反编译成 JSX

javascript - 在聊天 Discord.js 中发送消息 dm

javascript - 需要从页面源中定位视频代码,以及如何使视频可播放

c# - Winform变得不响应,异步编程,C#