При работе с Promise многим кажется, что callback, который мы передаем в конструктор выполнится только тогда, когда мы вызовем метод then() или воспользуемся async / await.
Но реальное поведение совершенно противоположное:
Создадим Promise, например так
const promise = new Promise((resolve,reject) => {
console.log('Promise callback executed');
resolve(1)
})
И запустим код
Promise callback executed

Обычно это поведение не заметно (да и в целом ускоряет работу с Event Loop), но если в Promise делается что то тяжелое, например, вызывается exec функция с кодировкой видео ffmpeg, а мы вдруг решили собрать промайсы в массив, и выполнять понемногу, по 2-3 штуки, дабы не нагружать ресурсы сервера, то результат будет заметен сразу.
Мы такие собираем наш массив, например для кодировки 100 видео.
И тут замечаем, что сервер дымится и искрится, а в htop все заполонили процессы ffmpeg...

Такое себе...
Тогда решением здесь собрать строки комманд в массив, и уже затем разбивать по пачкам.
Но тут возникает спортивный интерес, может как то возможно не исполнять callback промайса до его вызова? Спойлер - можно! Нужно просто написать свой Promise с колбеками и экзеками 🙂
class DeferredPromise {
constructor (cb) {
this.cb = cb
}
then (cb) {
this.exec().then(cb)
}
exec () {
return new Promise((resolve, reject) => {
this.cb(resolve, reject)
})
}
}
const promises = []
for (let i = 0; i < Array(2).length; i++) {
promises.push(new DeferredPromise((resolve, reject) => {
console.log(`Promise ${i} callback executed`)
resolve(1)
}))
}
Запустим и выводе не будет ничего.
Добавим вызов