Mesuti, как вариант, можно несколько отдельных useState. Но это ничего принципиально не поменяет. Спреды как раз для таких штук придуманы. Так что это да, хороший практис. В редьюсерах для редукса тоже без спредов не обходится.
Zhenia Bel, current содержит текущий минимум. Изначально он равен некоему максимально возможному числу, и если массив пустой, то так и останется. Обход массива делается с конца.
Захаров Александр, взять некий начальный префикс, например, '#'. Предварительно обойти рекурсивно объект. Если при обходе встречается строка, которая начинается на такой префикс (строковый метод startsWith), то к префиксу прибавляем рандомный символ (снова обходить не надо, идем дальше, потому как все пройденные строке не начинаются на обновленный префикс). В итоге получим, например, '#^qu'. Далее нормализуем объект, все id обозначаем как '#^qu0', '#^qu1', и т.д.
Hemul GM, ну например строки в js или c# - это неизменяемые объекты. Потому что разработчики языков решили, что так будет удобнее в большинстве случаев.
Опять же, в классе вполне может быть какое-то поле, содержащее неизменяемый объект (да хотя бы те же строки, но необязательно). Т.е. мы можем присваивать в это поле, но не можем менять что-то в объекте. Это комбинированный подход, где есть как мутабельность, так и иммутабельность.
Такие кейсы никак не противоречат ООП.
Надим Закиров, то есть у тебя нет добавления заданий по ходу пьесы, сразу готовый массив? Ну тогда, повторюсь, это должен быть массив функций, и он сам по себе будет как очередь, из которой первые limit задач будут разобраны сразу, а далее - по готовности, как я описал выше.
Надим Закиров, не надо тут никакого race().
Поступает новое задание (функция). Если выполняемых тасков меньше лимита, то функция сразу выполняется. Если есть лимит, то функция кладется в очередь, а первое завершившееся задание проверит, что очередь не пустая, и застартует головной элемент из неё.
Это классическая задача, реализованная миллионом разработчиков миллион раз.
просто я пилю очередь задач, где каждая задача - промис.
обычно в таких ситуациях каждая "задача" - это не промис, а функция, которая стартует асинхронщину и возвращает промис. В твоей постановке выглядит странно. Есть лимит, но на старте имеем все запущенные задачи.
WbICHA, ну а смысл не верить? ) Есть вопрос, есть соответствующий этому вопросу ответ. Автор мог ошибиться где угодно при формулировке вопроса, но это никого не волнует.