Web*_*ght 0 javascript web-worker async-await
我正在尝试卸载阻止我的 UI 的长时间运行的进程。
WebWorker 方法似乎是解决这种情况的最佳方法。
但是,我需要使用的库之一具有 async/await。
WebWorker 具有有限的 JS API,并且似乎没有 async/await。
有没有办法在 WebWorker 中使用 Promises?
错误
参考错误:__awaiter 未定义
问候,
丹尼尔
更新:
添加 __awaiter 导致无法识别 Promise。
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);
});
}
Run Code Online (Sandbox Code Playgroud)
这是 Web Worker 构建方式的骨架代码。
/* eslint-disable */
export default function ModelWorker() {
this.window = this
onmessage = async (e) => {
console.log(e);
}
}
Run Code Online (Sandbox Code Playgroud)
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))
}
}
Run Code Online (Sandbox Code Playgroud)
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.
}
Run Code Online (Sandbox Code Playgroud)
async/await是ECMAScript 语言的一部分,它们在所有全局范围内都可用,无论是 Window、Web Worker、Service Worker、Audio Worklet、Paint Worklet 等。
这些范围可能没有一些 Web API,例如 DOM API、MediaDevices API、Geolocation API 和其他一些。但是,只要浏览器支持此 ECMAScript 功能,那么所有范围都将支持。
所以我不知道你的问题是什么,但绝对可以在 Worker 中使用 Promises 和 async/await。
const worker = new Worker(
URL.createObjectURL(
new Blob([worker_script.textContent])
)
);
worker.onmessage = ({data}) => console.log(data);Run Code Online (Sandbox Code Playgroud)
<script type="worker-script" id="worker_script">
(async function() {
postMessage(['starting', performance.now()]);
await wait(2000);
postMessage(['ended', performance.now()]);
})();
function wait(time) {
return new Promise((res)=>setTimeout(res, time));
}
</script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4767 次 |
| 最近记录: |