При работе с 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)
  }))
}

Запустим и выводе не будет ничего.

Добавим вызов