UNPKG

mathjs

Version:

Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with dif

80 lines (67 loc) 2.12 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>math.js | web workers</title> </head> <body> <p> In this example, a math.js parser is running in a separate <a href="https://www.html5rocks.com/en/tutorials/workers/basics/">web worker</a>, preventing the user interface from freezing during heavy calculations. </p> <p id="results"></p> <script> /** * MathWorker evaluates expressions asynchronously in a web worker. * * Example usage: * * const worker = new MathWorker() * const expr = '12 / (2.3 + 0.7)' * worker.evaluate(expr, function (err, result) { * console.log(err, result) * }) */ function MathWorker () { this.worker = new Worker('worker.js') this.callbacks = {} this.seq = 0 // create a listener to receive responses from the web worker const me = this this.worker.addEventListener('message', function(event) { const response = JSON.parse(event.data) // find the callback corresponding to this response const callback = me.callbacks[response.id] delete me.callbacks[response.id] // call the requests callback with the result callback(response.err, response.result) }, false) } /** * Evaluate an expression * @param {string} expr * @param {Function} callback Called as callback(err, result) */ MathWorker.prototype.evaluate = function evaluate (expr, callback) { // build a request, // add an id so we can link returned responses to the right callback const id = this.seq++ const request = { id: id, expr: expr } // queue the callback, it will be called when the worker returns the result this.callbacks[id] = callback // send the request to the worker this.worker.postMessage(JSON.stringify(request)) } // create a MathWorker const worker = new MathWorker() // evaluate an expression via the worker worker.evaluate('12 / (2.3 + 0.7)', function (err, result) { document.getElementById('results').innerHTML += 'result: ' + result + '<br>' }) </script> </body> </html>