Мне нужно было решить эту проблему, но я не хотел зависеть от setTimeout (таймеры могут вести себя странно, когда браузер свернут, и обычно кажется, что он не использует Рафаэля правильно).
Итак, вдохновленныйпо батутам я создал очередь анимации.
Общая стратегия состоит в том, чтобы помещать анонимные функции в очередь, требуя, чтобы где-то в функции animations.next
вызывался напрямую или передавалсяанимация для запуска.
animations = function() {
var animationQueue = []
, obj = {}
obj.push = function(fn) {
animationQueue.push(fn)
}
obj.next = function() {
if (animationQueue.length !== 0) {
animationQueue.shift().call()
}
}
return obj
}()
Затем вы можете сделать что-то подобное несколько раз:
animations.push(function() {
paper.circle(x, y, 2)
.attr('fill', '#fff')
.animate({r: radius}, animationSpeed, animations.next)
})
Наконец, в конце того, что вы делаете, позвоните animations.next()
чтобы запустить цепочку.