与工作人员一起评估 JavaScript 表达式
Evaluating JavaScript expression with a worker
我需要在浏览器中计算 JavaScript 个表达式,Chrome。为了安全起见,我使用 Blob
和 Worker
运行 我的评估器,直到它发回超时结果取消等待。这工作正常。我还需要为我的 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
不为空,我需要 return 那 - _output
而不是求值表达式,如
EnvObject.appendOutput('hello');
var a = 0;
++a;
应该returnhello
;如果没有 appendOutput
,它应该 return 1
.
我该如何处理这样的事情?
@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);
}
}
我需要在浏览器中计算 JavaScript 个表达式,Chrome。为了安全起见,我使用 Blob
和 Worker
运行 我的评估器,直到它发回超时结果取消等待。这工作正常。我还需要为我的 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
不为空,我需要 return 那 - _output
而不是求值表达式,如
EnvObject.appendOutput('hello');
var a = 0;
++a;
应该returnhello
;如果没有 appendOutput
,它应该 return 1
.
我该如何处理这样的事情?
@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);
}
}