Я пытаюсь разгрузить длительно работающий процесс, который блокирует мой пользовательский интерфейс.
Подход WebWorker представляется наилучшим подходом в этой ситуации.
Однако одна из библиотек, которая мне нужнаиспользовать async / await.
WebWorker имеет ограниченный JS API и, по-видимому, не имеет async / await.
Есть ли способ использовать Promises внутри WebWorker?
Ошибка
ReferenceError: __awaiter не определен
С уважением,
Даниэль
Обновление:
Добавление __awaiter ведет к тому, что Обещание не распознается.
var __awaiter =
(this && this.__awaiter) ||
function(thisArg, _arguments, Promise, generator) {
return new Promise(function(resolve, reject) {
generator = generator.call(thisArg, _arguments);
function cast(value) {
return value instanceof Promise && value.constructor === Promise
? value
: new Promise(function(resolve) {
resolve(value);
});
}
function onfulfill(value) {
try {
step('next', value);
} catch (e) {
reject(e);
}
}
function onreject(value) {
try {
step('throw', value);
} catch (e) {
reject(e);
}
}
function step(verb, value) {
var result = generator[verb](value);
result.done
? resolve(result.value)
: cast(result.value).then(onfulfill, onreject);
}
step('next', void 0);
});
}
Ниже приведен скелетный код для построения веб-работника.
/* eslint-disable */
export default function ModelWorker() {
this.window = this
onmessage = async (e) => {
console.log(e);
}
}
WorkerProxy.js
export default class WorkerProxy {
constructor(worker) {
const code = worker.toString()
const src = code.substring(code.indexOf('{') + 1, code.lastIndexOf('}'))
const blob = new Blob([src], { type: 'application/javascript' })
return new Worker(URL.createObjectURL(blob))
}
}
SomeComponent.js
import WorkerProxy from './WorkerProxy'
import ModelWorker from './ModelWorker'
if (!!window.Worker) {
const worker = new WorkerProxy(ModelWorker)
worker.addEventListener('message', e => console.log(e.data))
worker.postMessage({ message:message })
// Load labels, etc.
}