有意义吗?"/>
创建worker.js来处理promise有意义吗?
我正在构建一个电子应用程序,允许用户从本地驱动器加载字体文件作为
FontFace
实例或加载到 FontFace
。在某些情况下,会有数以万计的文件,因此有承诺。当如此大量的承诺中的一小部分由于某种原因被拒绝时,它就会挂起应用程序。在研究如何解决这个问题时,我在许多其他潜在的解决方案中想到了使用工人的想法。 因为 Promise 已经是异步的,所以创建一个仅处理 Promise 的 Worker 是否有意义?
// renderer.js
myAPI.onFontListReady(jsonFontList => {
const worker = new Worker('worker.js');
jsonFontList.forEach(objFontData => {
worker.postMessage({
command: 'load and render',
objFontData: objFontData
})
// worker.js
addEventListener('message', message => {
if (message.datamand === 'load and render')
loadAndRender(message.data.objFontData)
})
function loadAndRender(objFontData) {
const
ff = new FontFace(`_${objFontData.newFileName}`, `url('${objFontData.newFilePath.replace(/\\/g, '/')}')`)
ff.load()
.then(
() => {
document.fonts.add(ff)
postMessage([objFontData])
},
error => {
console.error('ERROR LOADING @FONT-FACE:', error)
postMessage([objFontData, 'error'])
}
)
}
回答如下:
*是的,使用 Web Worker 来处理 Electron 应用程序中的 Promise 可能是一个好主意。 Web Worker 在后台运行,可以并发执行任务而不影响主线程,这有助于防止应用程序在处理大量 Promise 时挂起。
您的实现看起来很适合将字体加载和渲染卸载给网络工作人员。这样,主线程在工作线程处理异步任务时保持响应。 但是,请记住,Web Worker 有一些限制,例如无法直接访问 DOM。在您的情况下,由于您正在处理 FontFace 实例和渲染,因此您似乎在工作人员中适当地处理了这个问题。
更多推荐
创建worker.js来处理promise有意义吗?
发布评论