Callback и Promise
Выполнение до завершения (run-to-completion)
Обычные функции (не генераторы) JavaScript работают по принципу выполнение до завершения, т.е. код внутри одной функции начнет выполнятся и будет завершен до начала выполнения другой функции.
Promise
Promise — API для работы с асинхронным кодом.
Промисы имеют ряд преимуществ перед колбэками:
-
Промис всегда выдаст уведомление о разрешении, если были зарегистрированы функции
resolveиreject. Одна из них в любом случае будет вызвана -
После того как промис разрешится, его значение становится неизменным. Это поведение гарантирует что повторная проверка значения даст тот же результат. Колбэки такого гарантировать не могут
-
Промисы упрощают описание последовательности выполнения асинхронного кода
-
Делают обработку ошибок проще
При работе с промисами нужно учитывать их планирование. Если один промис разрешается другим, то распаковка последнего будет проходить следующей микрозадачей:
const promise1 = new Promise((resolve) => {
resolve(1)
});
const promise2 = new Promise((resolve) => {
resolve(promise1)
});
const promise3 = new Promise((resolve) => {
resolve(2)
});
promise2.then((value) => console.log(value));
promise3.then((value) => console.log(value));
// 2
// 1
Callback
Callback — функция, которая будет выполнена потом. Передается параметром в другую функцию, позволяя продолжить выполнение другой части программы через какой-то промежуток времени. Базовый элемент работы с асинхронным кодом.
function callback() {
console.log('one second...');
}
setTimeout(callback, 1000);Исключением является функция executor переданная в Promise, она будет выполнена сразу (синхронно).
new Promise(() => {
console.log('now') // выполнится сразу
})