创建worker.js来处理promise有意义吗?

问题描述 投票:0回答:1

我正在构建一个电子应用程序,允许用户从本地驱动器加载字体文件作为

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.data.command === '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'])
    }
  )
}
javascript node.js fonts electron font-face
1个回答
0
投票

*是的,使用 Web Worker 来处理 Electron 应用程序中的 Promise 可能是一个好主意。 Web Worker 在后台运行,可以并发执行任务而不影响主线程,这有助于防止应用程序在处理大量 Promise 时挂起。

您的实现看起来很适合将字体加载和渲染卸载给网络工作人员。这样,主线程在工作线程处理异步任务时保持响应。 但是,请记住,Web Worker 有一些限制,例如无法直接访问 DOM。在您的情况下,由于您正在处理 FontFace 实例和渲染,因此您似乎在工作人员中适当地处理了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.