繁体   English   中英

我如何解决承诺中已经在运行的承诺

[英]How can i resolve an already running promise in my promise

这是我的第一个问题。

我有以下代码:

const work = async () => {
  const file = new lineByLine(filename);
  let line;

  while (line = file.next()) {
    const worker = await getIdleWorker()
    worker.assign({documentId: line.toString()})
    worker.work()
  }
}


// todo: I need time for resolve other promises meanwhile this is executed.
const getIdleWorker = async () => {
  while (true) {
    for (let i = 0; i < workers.length; i++) {
      const worker = workers[i]

      if (worker.isReady()) {
        return worker;
      }


    // Solution: give time to resolve other promises.
    await sleep(10).milliseconds();
    }
  }
}

worker.work方法将running的属性设置为true,执行一项工作,准备好后,将running的相同属性更改为false。 同时,getIdleWorker()搜索具有该属性running为false的工作程序,该方法永远等待直到找到空闲工作程序为止。

我想问题是永远找不到空闲的工作程序,因为诺言worker.work永远不会得到解决,因为主线程卡在了getIdleWorker中。

哪个是解决此类问题的最佳解决方案? 我不在乎是否必须完全更改设计。

谢谢 !

此实现应该正常工作,它每秒检查一次空闲的工作程序,如果找到了,则将其返回。

const getIdleWorker = () => {
  return new Promise(resolve => {
    const findFreeWorker = () => {
      for (let i = 0; i < workers.length; i++) {
        const worker = workers[i]
        if (worker.isReady()) {
          return worker;
        }
      }
      return null
    }

    const searchFor = setInterval(() => {
      const freeWorker = findFreeWorker()
      if (freeWorker) {
        clearInterval(searchFor)
        resolve(freeWorker)
      }
    }, 1000)
  })
}

问题是while (true) {阻塞了事件循环,因此Node.js只能永远执行那段代码,添加async试图仅返回Promise,但是代码处于无限循环中。

在这里您可以找到一篇很好的文章,以更好地了解Node.js的异步模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM