0

我目前正在开发一个计算器,它将作为打包的(桌面)chrome 应用程序运行。我正在使用math.js库来解析数学输入。这是我的旧代码:

评估.js:

var parser = math.parser();  
function evaluate(input){  
    $("#output").text(parser.eval(input));  
}

但是,如果输入是不合理的,例如6234523412368492857483928!,应用程序就会冻结,因为它正在尝试评估输入。我知道它math.js仍处于测试阶段,所以最终可能会有一个修复(溢出错误),但我找不到任何其他像这样解析原始输入的库math.js

为了解决这个问题,我正在尝试使用网络工作者来异步运行它来解决这个问题。这是我现在拥有的代码:

main.js

var evaluator = new Worker('evaluate.js');
evaluator.addEventListener('message', function(e){
    $("#output").text(e.data);
}, false);
function evaluate(input){
    evaluator.postMessage(input);
}

评估.js

var parser = math.parser();
function mathEval(input){
    return parser.eval(input);
}
self.addEventListener('message', function(e){
    self.postMessage(mathEval(e.data));
});

但是,当我运行它时,这不起作用。另外,我注意到当我使用网络工作者时,它会抛出错误Uncaught ReferenceError: math is not defined - evaluate.js:1,但它没有用旧代码抛出这个错误。

问题:为什么这段代码不能评估输入?是否可以使用多个工人来加快速度?如果我想在工作人员花费超过 2 秒时实现某种溢出错误,那么最好的方法是什么?最后,有没有更好的方法来做到这一点?

4

1 回答 1

1

Web Workers 在完全独立的上下文中运行。他们无权访问父网页中的对象。如果你想使用 math.js,你必须使用 importScript 将它导入到 worker 中。

我建议阅读使用 Web Worker指南,“导入脚本和库”部分描述了如何做到这一点,以及它是如何工作的。

于 2013-10-05T20:08:51.103 回答