Вы не понимаете, как работают промисы и JS. Это самая главная ошибка.
Попробую чуть-чуть объяснить.
fn(a,b,c).then(fn(k,m,n))
Вот так вы пишете. Что здесь происходит.
fn срабатывает и
сразу же возвращает объект типа промис, в котором вы вызываете метод then. Этот метод принимает две функции - для успеха и для фейла. В качестве функции успеха вы указываете выражение fn(k,m,n). Окей, далее JS
вычисляет это выражение, то есть буквально выполняет эту функцию и в качестве результата получает новый промис, который используется в качестве callback функции успеха для первого промиса.
Внимательно перечитайте документацию.
https://learn.javascript.ru/promise
Исправлением ошибки будет что-то вроде этого:
animation(1, 500, log)
.then(e=>animation(2, 1000, log))
.then(e=>animation(3, 2000, log))
.then(e=>animation(4, "500", log));