使用worker

时间:2017-12-04 23:50:02

标签: javascript evaluation

我需要在浏览器Chrome中评估JavaScript表达式。为了安全起见,我使用BlobWorker运行我的评估程序,直到它回发结果超时取消等待。这工作正常。我还需要为我的JavaScript支持一个环境。我这样做如下:

function evalWorker () {
  let postResponse = function(expr, ...) {
    let presets = `var EnvObject = {};
                EnvObject.platform = "Chrome";
                EnvObject.pasteboard = "${clipboard}";
                EnvObject.baseDate = new Date();
                ...
                EnvObject._output = "";
                EnvObject.appendOutput = (str) => {EnvObject._output += str; };
                `
    postMessage(eval(presets + expr));
  };
  onmessage = function(e) {
    postResponse(e.data['expression'], e.data['clipboard'], ...);
  }
}

我的问题是如果_output不为空,我需要返回 - _output而不是评估的表达式,如

EnvObject.appendOutput('hello');
var a = 0;
++a;

应该返回hello;如果没有appendOutput,则应返回1

我怎么会这样做?

1 个答案:

答案 0 :(得分:0)

@Bergi有正确的想法推出范围。以下是有效的。

function evalWorker () {
  let postResponse = function(expr, TextExpander) {
    let result = eval(expr);
    if (EnvObject._output && EnvObject._output.length) {
      postMessage(EnvObject._output);
    } else {
      postMessage(result);
    }
  };
  onmessage = function(e) {
    var EnvObject = {};
    EnvObject.platform = "Chrome";
    EnvObject.pasteboardText = e.data['clipboard'];
    ...
    EnvObject._output = "";
    EnvObject.appendOutput = function(str) {EnvObject._output += str; };
    postResponse(e.data['expression'], EnvObject);
  }
}