Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用contextify从节点vm内部返回异步结果_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 使用contextify从节点vm内部返回异步结果

Javascript 使用contextify从节点vm内部返回异步结果,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在使用contextify()在节点沙箱中运行异步“不受信任”脚本。同样的问题也适用于节点0.12+vm.runInContext() 是否有任何未记录的函数或事件允许我知道vm何时执行了所有操作? 或者有没有一种巧妙的方法来包装这个请求承诺函数,以便我在vm之外获得消息?只需创建一个匿名函数来处理要传递的回调 Contextify = require('contextify'); rp = require('request-promise'); var myCode = "functio

我正在使用contextify()在节点沙箱中运行异步“不受信任”脚本。同样的问题也适用于节点0.12+vm.runInContext()

是否有任何未记录的函数或事件允许我知道vm何时执行了所有操作?
或者有没有一种巧妙的方法来包装这个请求承诺函数,以便我在vm之外获得消息?

只需创建一个匿名函数来处理要传递的回调

Contextify = require('contextify');
rp = require('request-promise');

var myCode = "function(callback) { rp('http://www.google.com').then(callback); }"
defaultContext =  { rp: rp, setTimeout : setTimeout, console: console }

vm = Contextify( defaultContext )
vm.run( myCode )(function(htmlString) {
    // Do what you need here
    });

但是,如果您真的不信任代码,我将创建一个辅助匿名函数来保护回调本身不被修改。

只需创建一个匿名函数来处理要传递的回调

Contextify = require('contextify');
rp = require('request-promise');

var myCode = "function(callback) { rp('http://www.google.com').then(callback); }"
defaultContext =  { rp: rp, setTimeout : setTimeout, console: console }

vm = Contextify( defaultContext )
vm.run( myCode )(function(htmlString) {
    // Do what you need here
    });

但是,如果你真的不信任代码,我会创建一个二级匿名函数来保护回调本身不被修改。

谢谢@jonathan gray,这是个好主意。尽管部分问题在于这个myCode是由用户生成的。我不确定是否存在可以检测到的模式来包装函数。您能推荐一种解析请求承诺脚本的方法,这种方法可以在最简单的用例中工作吗?谢谢again@LPG您的用例中哪一个是不适用的?您可以简单地包装用户代码,例如
“函数(回调){'use strict';\n”+myCode+“\n}”
,传递给它的任何内容都将被共享。例如,您可以向其传递一个空白对象。如果修改了对象,您可以在回调时检索更改(您可以命名
callback
一些更实用的东西,例如
done
)。代码非常有用。我所处理的全部是无法重写的遗留代码。不过我会为未来的读者提出一些修改建议。由于该示例在contextify中失败,因此需要像这样将函数包装在参数中:var myCode=“(函数(回调){“+userCode+”})”。还有,我的用例就是标记作业完成。类似于:var myCode=“(x=1;函数(回调){rp({x=2;回调()});})”vm=Contextify(defaultContext);run(myCode)(函数(){jobicomplete=true});谢谢@jonathan gray,这是个好主意。尽管部分问题在于这个myCode是由用户生成的。我不确定是否存在可以检测到的模式来包装函数。您能推荐一种解析请求承诺脚本的方法,这种方法可以在最简单的用例中工作吗?谢谢again@LPG您的用例中哪一个是不适用的?您可以简单地包装用户代码,例如
“函数(回调){'use strict';\n”+myCode+“\n}”
,传递给它的任何内容都将被共享。例如,您可以向其传递一个空白对象。如果修改了对象,您可以在回调时检索更改(您可以命名
callback
一些更实用的东西,例如
done
)。代码非常有用。我所处理的全部是无法重写的遗留代码。不过我会为未来的读者提出一些修改建议。由于该示例在contextify中失败,因此需要像这样将函数包装在参数中:var myCode=“(函数(回调){“+userCode+”})”。还有,我的用例就是标记作业完成。类似于:var myCode=“(x=1;函数(回调){rp({x=2;回调()});})”vm=Contextify(defaultContext);run(myCode)(函数(){jobicomplete=true});