@6ncn6inq3jqx

Почему не работают промисы?

Помогите разобраться, почему промисы не резолвятся? Код просто встает в первом цикле.
Мне кажется, я что-то не уловил базовое в промисах, так как изучаю JS не так давно.
Суть задачи: таскменеджер, в котором свободные роботы выполняют задачи, пока задачи не кончатся в очереди.

class Robot {
    constructor() {
        this._isFree = true;

        this._successCount = 0;
        this._failedCount = 0;
        this._tasks = [];
        this._timeSpent = 0;
    }

    get isFree() {
        return this._isFree;
    }

    doTask(task) {
        this._tasks.push(task.id);
        this._isFree = false;

        const startTime = Date.now();
        const promise = task.job();

        promise
            .then(() => this._successCount++)
            .catch(() => this._failedCount++)
            .finally(() => {
                this._timeSpent += Date.now - startTime;
                this._isFree = true;
            });
    }

    getReport() {
        return {
            successCount: this._successCount,
            failedCount: this._failedCount,
            tasks: this._tasks.slice(),
            timeSpent: this._timeSpen,
        };
    }
}

class TaskManager {
    constructor(N) {
        this._tasksQueue = [];
        this._robots = [];

        for (let i = 0; i < N; i++)
            this._robots.push(new Robot());
    }

    addToQueue(task) {
        this._tasksQueue.push(task);
    }

    run() {
        this._tasksQueue.sort((aTask, bTask) => aTask.priority - bTask.priority);

        while (this._tasksQueue.length) {
            const robot = this._robots.find(robot => robot.isFree);
            if (robot)
                robot.doTask(this._tasksQueue.pop());
        }

        while (this._robots.some(robot => !robot.isFree)) { }

        return new Promise((resolve) => {
            resolve(this._robots.reduce((report, robot) => {
                report.push(robot.getReport());
                return report;
            }, []));
        });
    }
}
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
while (this._robots.some(robot => !robot.isFree)) { }


это бесконечный цикл. Занятые роботы отработают, но ответы будут ждать в event-loop, пока не закончится текущий таск. А он не закончится - у него тут, видите ли, бесконечный цикл.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы