Не очень понятно, что вам нужно. Онлайн-раскраска как себя вести должна? Просто заливка должна срабатывать при тычке мышью в область, ограниченную контуром? Тогда я бы делал так: в векторном графическом редакторе рисовал бы раскрашенную картинку, а при выводе на веб-странице заменял бы все цвета кроме чёрного на белый, а в onclick этих элементов сделал бы возврат старого цвета (или выбранного пользователем).
Искусственный интеллект: современный подход (Artificial Intelligence: A Modern Approach), Питер Норвиг. Сокращённо называют AIMA и часто ссылаются как на фундамент.
Negwereth: автор явно пытается запрограммировать какую-то конструкцию из другого языка, а не решить изначальную задачу так, как она решается в Ноде. Типа как "подскажите, как запрограммировать на Ноде цикл, не используя for и forEach".
"красивое решение как прервать асинхронную функцию в которой 5 слипов и между ними 5 tcp соединений" - уничтожить таймер, который создаёт ваш "слип" (сохранять таймер, создаваемый в snooze, в одной и той же внешней переменной, ассоциированной с конкретной функцией, которую вы хотите "прерывать", и потом вызывать clearTimeout, когда захочется функцию прервать). Если не хотите воротить воркеры.
Михаил Юрьевич: "выкопайте мне яму, только пожалуйста, не нужно скатываться к лопате или экскаватору". Таки ваша задача очень похожа на разделение логики на мастера и управляемого воркера. Не нужно пытаться программировать на Ноде так, будто это C++. (Впрочем, и для любителей сделать ежа из ужа найдётся инструмент - https://www.npmjs.com/package/webworker-threads , можете воркеры помещать в потоки, пока не научитесь программировать в парадигме Ноды).
Михаил Юрьевич: ответил уже на ваш вопрос. Если функция что-то непрерывно вычисляет, то остановить её из того же потока не получится, т.к. в нём работает только эта вычисляющая функция (даже калбэки на IO-события или события таймера не смогут выполниться, если функция не вызывает внутри себя никаких асинхронных операций). В этом случае единственный способ прерывать вычисления - вынести их в воркер и прибивать воркер при необходимости. Если же функция ничего не вычисляет, а лишь ждёт события от таймера (в Ноде таймеры не замораживают поток, а лишь вызывают калбэки в указанное время), то чтобы отменить исполнение этой ждущей функции достаточно уничтожить таймер вызовом clearTimeout. Не стесняйтесь чего-то недопонимать, асинхронная модель исполнения - не такая уж и простая тема и требует не только теории, но и практики, чтобы "озариться пониманием" :).
Dark Hole: у вас каша в голове, а я не очень понимаю предмета и мотива беседы. Не нравится Нода - ну и бох с вами, страдайте программируя на ней дальше :).
Михаил Юрьевич: вы явно не понимаете, как работает Нода. На Хабре была пара статей цикл работы Ноды, про тачки и микротаски, про таймеры. (Погуглите, я пока с телефона, и мне не очень удобно это делать.)
Dark Hole: попробуйте и на C++, чтобы понять, что такое многопоточное программирование, мютексы, критические секции, семафоры. Потом ещё попробуйте Эрланг или Смаллтолк, попробуйте постичь другие парадигмы многозадачности, акторную модель, к примеру. И возвращайтесь программировать на Ноде с любовью, а не обзывая её костылями только потому, что когда-то какой-то школьник так сказал, не сумев в своей голове уместить более двух подходов к решению одной абстрактной проблемы :).
Dark Hole: не понял, что вы уточняете. Нет никаких костылей, просто иная парадигма проектирования приложений, по сравнению с C++, например. Но никто вам не мешает и на C++ написать модуль для Ноды.
Если нужны долгие, но прерываемые вычисления, отправляйте их в воркер (с помощью модуля cluster, например), и при необходимости убивайте воркер (пересоздавайте).
> Необходимость прервать выполнение может попасть на долгий sleep и долгую сетевую операцию
Не может, в этом суть Ноды (или даже libev), которая все IO-операции делегирует в другой поток, в "вычислительном" потоке Ноды, по-сути, находятся только калбэки (явные, в том числе от таймеров, и неявные).
> Постоянная проверка флага перед каждым await убивает всю элегантность решения
По-другому не получится, потому как никто другой не сможет проверить необходимость остановки, Нода (или даже V8) однопоточная, и в долгие вычисления "непрерывной" функции не сможет вмешаться даже обработчик событий (например, по сигналу от IO или соседнего воркера).