收藏
回答

使用Promise.all处理多个worker返回的Promise,没有回调

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.createWorker Promise 工具 8.0.19 2.25

主线程调用多个worker并返回Promise,然后用Promise.all同步处理结果,但是和预期不一样,Promise.all没有回调

const app = getApp()
Page({
  data: {


  },
  async onLoad() {
    let ps=[]
    const worker = wx.createWorker('workers/worker.js') // 文件名指定 worker 的入口文件路径,绝对路径
    for (let i = 0; i < 2; i++) {
      let p=new Promise((resolve,reject) => {
        worker.postMessage('counting '+i)
        worker.onMessage(res => {
          console.log('main thread|'+res);
          resolve(res)
        })
        worker.onProcessKilled(error => {
          reject(error)
        })
      })
      ps.push(p)/**/
      // 不使用worker是可以回调Promise.all的
      // ps.push(new Promise(resolve => setTimeout(resolve,100)))
    }
    let ress=await Promise.all(ps)
    console.log({ress})
  },
})



最后一次编辑于  2022-07-22
回答关注问题邀请回答
收藏

3 个回答

  • Ray
    Ray
    2022-07-22

    只能创建一个worker子线程,那多线程的意义又在哪了?我有一个并行计算的优化需求。只有一个线程,提升的效率似乎并不高呢。各位有没有其他方案呢?

    2022-07-22
    有用
    回复
  • 郑钱花
    郑钱花
    2022-07-22

    问题找到了,哥给你优化下代码吧

    const ps = [...new Array(2)].map((_,i) => (
      new Promise((resolve,reject) => {
           worker.postMessage('counting '+i)
           worker.onMessage(res => resolve(res))
           worker.onProcessKilled(error => reject(error))
       })
     ))
    const ress=await Promise.all(ps)
    console.log({ress})
    


    2022-07-22
    有用
    回复
  • 武曲心
    武曲心
    2022-07-22

    走catch了

    2022-07-22
    有用
    回复 1
登录 后发表内容