Как я могу решить уже выполняющееся обещание в моем обещании - PullRequest
1 голос
/ 29 марта 2019

это мой первый вопрос здесь.

У меня есть этот код:

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.

Какое наилучшее решение для подобной проблемы?Мне все равно, если мне придется полностью изменить дизайн.

Спасибо!

1 Ответ

0 голосов
/ 29 марта 2019

Эта реализация должна работать, она каждую секунду проверяет наличие свободного работника, и если он его находит, работник возвращается обратно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...