Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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 在Node.js中,如何从vm2返回承诺?_Javascript_Node.js_Assert_Node Vm2 - Fatal编程技术网

Javascript 在Node.js中,如何从vm2返回承诺?

Javascript 在Node.js中,如何从vm2返回承诺?,javascript,node.js,assert,node-vm2,Javascript,Node.js,Assert,Node Vm2,我有一些异步JavaScript代码,我想使用vm2/NodeVM运行这些代码 代码测试两个函数:用户提交的函数偶数和奇数和使用节点内置的断言库预定义的函数解决方案 我的问题是,我如何从vm.run()中获得我已解决的承诺 连续代码 这是我想转换成字符串并使用vm2运行的测试代码: const assert = require('assert'); function evenAndOdd(arr) { return [arr.filter(el => el % 2 === 0).so

我有一些异步JavaScript代码,我想使用vm2/NodeVM运行这些代码

代码测试两个函数:用户提交的函数
偶数和奇数
和使用节点内置的
断言
库预定义的函数
解决方案

我的问题是,我如何从
vm.run()
中获得我已解决的承诺

连续代码

这是我想转换成字符串并使用
vm2
运行的测试代码:

const assert = require('assert');

function evenAndOdd(arr) {
  return [arr.filter(el => el % 2 === 0).sort(), arr.filter(el => el % 2 === 1).sort()];
};

function solution(arr) {
  return [arr.filter(el => el % 2 === 0).sort(), arr.filter(el => el % 2 === 1).sort()];
};

const runTest = async () => {

  return new Promise((resolve, reject) => {

    const map = new Map();
    const tests = 10;

    for (let i = 0; i < tests; i++) {

      let randLength = parseInt(Math.random() * 19 + 1);
      let randArray = [...Array(randLength)].map(e => ~~(Math.random() * randLength));

      const test = async () => {
        return assert.deepEqual(evenAndOdd(randArray), solution(randArray));
      }

      const description = "TEST CASE: evenAndOdd([" + randArray + "}]) EXPECT: [[" + solution(randArray)[0] + "], [" + solution(randArray)[1] + "]] GOT: [[" + evenAndOdd(randArray)[0] + "], [" + evenAndOdd(randArray)[1] + "]]";

      test()
        .then(() => {
          map.set(description, true);
          if (map.size === tests) {
            resolve(map);
          };
        })
        .catch(() => {
          map.set(description, false);
          if (map.size === tests) {
            resolve(map);
          };
        })
    }
  })
}
虚拟机
vm
code

我的问题是,如何从
vm.run()

现在,上面的
结果
变量尚未定义

NodeVM.run()
执行代码并返回由执行创建的模块,然后主机代码可以访问该模块。为了在处理后的代码中访问计算结果,应将其分配给
模块.exports

考虑以下示例:

const {NodeVM} = require("vm2");
const vm = new NodeVM();

const vmExports = vm.run('module.exports.pr = Promise.resolve(42);');

vmExports.pr.then(x => console.log(x));
变量
vmExports
保存通过
run
调用导出的模块,字段
vmExports.pr
保存沙盒脚本生成的承诺。导出的承诺可以访问或等待访问解析的值

const { NodeVM } = require('vm2');

  const vm = new NodeVM({
    console: 'inherit',
    sandbox: {},
    require: {
      external: true,
      builtin: ['assert'],
      import: ['assert'],
      root: "./",
    },
  });

const result = vm.run(stringifiedJavaScript, 'vm.js');
const {NodeVM} = require("vm2");
const vm = new NodeVM();

const vmExports = vm.run('module.exports.pr = Promise.resolve(42);');

vmExports.pr.then(x => console.log(x));