Чем отличаются от обратных вызовов?

Обратные вызовы не могут передавать возвращаемое значение остальной части программы. Это позволяет вам играть только с «побочными эффектами» (просто изменение состояния)

Использование чистых обратных вызовов приводит к пирамиде гибели. У вас есть обратные вызовы внутри обратных вызовов.

readFile(“file”, (err, res)=>{
if (err) return err;
   readFile(“file”, (err, res)=>{
      if (err) return err;
      // etc.
   }
})

Или вы можете использовать try catch. и т.д. по сути, этот способ действительно отстой.

вот тут-то и появляются обещания.

——————————————

Сам возврат является синхронным. не дает большой гибкости. return вернет немедленно. Мы не можем сохранить его в другую переменную.

Вы не хотите, чтобы следующий запускался до того, как вы закончите чтение файла и т. д.

Меня это смутило: функция-исполнитель должна иметь два параметра: параметр разрешения и параметр отклонения, каждый из которых определяет

.then

и

.catch

Ключевой момент: обещания находятся в ожидании до тех пор, пока они не будут разрешены/отклонены

console.log(myPromise) // pending
myPromise.then // this will week to resolve it
// once it does, it passes the value to the next then
// or if it's error, it passes to the next catch