Каким образом будут выполняться несколько асинхронных функций NodeJS?
Как я понял, все асинхронные функции ставятся в очередь. Вопрос в том, как будут выполняться функции, каждая доработает до конца или поочерёдно, пока какая-то из них не дойдёт до своего завершения и не выпадет из очереди, передавая друг другу управление?
Другими словами, если у нас есть три функции, отвечающие за движение своего прямоугольника в своём направлении vector(X,Y), будут ли эти прямоугольники двигаться по отдельности, сначала один до конца, потом другой, потом третий, или понемногу каждый, пока не придут в точку назначения?
Имено так как вы описали, прямоугольники будут двигатса по очереди а не паралельно.
Анимация движения паралельно, это на самом деле много последовательных анимацый, которые по очереди двигают каждый прямоугольник на немного.
А вообще с появлением генераторов, можно делать прерывания в пределах одной функции.
Да, но если мне нужно параллельное выполнение? Если функции отвечают за разное, но я не хочу, чтобы каждая функция блокировала выполнение остальных, а отрабатывала свои тики, а остальные давала работать другим функциям?
Если прямоугольники будут двигаться по очереди, что что в этих функциях асинхронного? Обычные синхронные функции. Асинхронные как раз и отличает передача управления общему потоку в процессе своего выполнения. И до генераторов с этим прекрасно справлялся setTimeout.
function move(figure){
figure.x += 10;
if (figure.x < 200) setTimeout(move, 25);
}
Так что двигаться прямоугольники будут одновременно.
Aves: а как по вашему будет работать "передача управления общему потоку", прямоульгоники будут двигася на 10 в вашм скрипте, по очереди, но очередь переключается слишком быстро, чтобы человек заметил.
Aves: Ясно, спасибо. Тут я вижу, что функцию нужно делать такую, чтобы она выполнялась быстро, а не цикл от 0 до 1000, например, и тогда будет быстрая передача управления. Но если сама функция выполняется достаточно долго? Мой вопрос был об этом. Если функция выполняется долго, как сделать так, чтобы она не блокировала выполнение остальных функций до своего завершения, а выполнялась некоторое количество времени, а потом отдавала управление остальным функциям в очереди, чтобы потом вновь продолжить своё выполнение?
mad_god: простых способов нет, node.js это всё-таки обычный javasript, пользовательский код выполняется синхронно и в одном потоке. В идеале долгую функцию нужно переписать в аддон, или плохой вариант - сделать отдельный модуль и выполнять в дочернем процессе
В любом случае переписывать, так что проще скорее всего будет как и писал Alexander Litvinenko разбить функцию на части и переписать в генератор, или использовать process.nextTick().