Skip to content

Instantly share code, notes, and snippets.

@deavial
Forked from sergiodxa/async-thread.js
Created September 9, 2022 18:13
Show Gist options
  • Select an option

  • Save deavial/8bc0a7ba547b137175198cd257766c0e to your computer and use it in GitHub Desktop.

Select an option

Save deavial/8bc0a7ba547b137175198cd257766c0e to your computer and use it in GitHub Desktop.

Revisions

  1. Sergio Daniel Xalambrí revised this gist Oct 6, 2016. 1 changed file with 35 additions and 0 deletions.
    35 changes: 35 additions & 0 deletions async-thread.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    function asyncThread(fn, ...args) {
    if (!window.Worker) throw Promise.reject(
    new ReferenceError(`WebWorkers aren't available.`)
    );

    const fnWorker = `
    self.onmessage = function(message) {
    (${fn.toString()})
    .apply(null, message.data)
    .then(result => self.postMessage(result));
    }`;

    return new Promise((resolve, reject) => {
    try {
    const blob = new Blob([fnWorker], { type: 'text/javascript' });
    const blobUrl = window.URL.createObjectURL(blob);
    const worker = new Worker(blobUrl);
    window.URL.revokeObjectURL(blobUrl);

    worker.onmessage = result => {
    resolve(result.data);
    worker.terminate();
    };

    worker.onerror = error => {
    reject(error);
    worker.terminate();
    };

    worker.postMessage(args);
    } catch (error) {
    reject(error);
    }
    });
    }
  2. Sergio Daniel Xalambrí created this gist Oct 5, 2016.
    57 changes: 57 additions & 0 deletions thread.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,57 @@
    function thread(fn, ...args) {
    if (!window.Worker) throw Promise.reject(
    new ReferenceError(`WebWorkers aren't available.`)
    );

    const fnWorker = `
    self.onmessage = function(message) {
    self.postMessage(
    (${fn.toString()}).apply(null, message.data)
    );
    }`;

    return new Promise((resolve, reject) => {
    try {
    const blob = new Blob([fnWorker], { type: 'text/javascript' });
    const blobUrl = window.URL.createObjectURL(blob);
    const worker = new Worker(blobUrl);
    window.URL.revokeObjectURL(blobUrl);

    worker.onmessage = result => {
    resolve(result.data);
    worker.terminate();
    };

    worker.onerror = error => {
    reject(error);
    worker.terminate();
    };

    worker.postMessage(args);
    } catch (error) {
    reject(error);
    }
    });
    }

    // example with an async/await function
    (async () => {
    try {
    const res1 = await thread(
    str => JSON.parse(str),
    '{"key": "value"}'
    );
    console.log(res1);
    } catch (error) {
    console.error(error);
    }
    })();

    // example using a sum function and promise syntax
    // function sum(n1, n2) {
    // return n1 + n2;
    // }
    // thread(sum, 1, 5)
    // .then(result => thread(sum, result, 1))
    // .then(result => console.log('result', result))
    // .catch(error => console.error('error', error));