Всем привет.
Недавно столкнулся с вопросом какая же все таки разница между колбеками и промисами.
По своему опыту понял, что в основном только в читабельности, так как оба подхода могут решить одинаковую задачу. Как по мне промисы более наглядно демонстрируют цепочку вложенностей, а колбеки создают порой лапшу, которая откровенно бесит. Хотелось бы услышать мнение уважаемых форумчан что лучше использовать и в каких случаях?
Если есть возможность использовать промисы, лучше всегда использовать промисы. Как ты верно подметил, что коллбеки что промисы решают одинаковые задачи. При этом промисы более гибкие: позволяют возвращать еще не зарезолвленное (not resolved) значение, таким образом дают другим функция работать с этим значением.
getUserInfo() // асинхронный запрос за данными
.then(getUserPosts) // следующий запрос выполнится на основании
//данных, полученных в предыдущем запросе
.then(processUserPosts) // обработка данных после 2-х связанных асинхронных запросов
Можешь поиграться со связанными промисами на демке сервера, который отдает реальные данные. В свое время делал для тренировок работы с API
Код GitHub - podgorniy/todo-server
Демка https://hidden-brook-8135.herokuapp.com (на самой странице можно видеть код из цепочек промисов).
Да, согласен, здесь промисы выигрывают. Тоже отдаю предпочтение им, но вот появился RxJs и Observable, начал потихоньку вкуривать эту технологию и принципы реактивного программирования, кажется, что ближайшее будущее за этим =)
Паттерны из frp (functional reactive programming) не вытеснят и не заменят собой работу с промисами и коллбеками: все равно взаимодействие с REST API, особенно такого формата (получил одни данные, обработал, запросил еще данные) в парадигме frp описываются крайне неудобно.
В этом вопросе (как менеджерить асинхронность) серебрянкой пули не будет. Использовать надо то, что лучше подходит под задачу.
Возможно тебе будет интересно узнать еще об одном frp паттерне, который используется в метеоре https://meteorhacks.com/journey-into-meteors-reactivity/
Спасибо за ответ и ссылку, обязательно ознакомлюсь!
Промис это некая сущность, которую можно не только вернуть из функции, но и сохранить куда-нибудь для дальнейшего использования. Простейший пример это кеширование.
function longFunc(param) {
return new Promise((resolve, reject) => {
// тут что-то асинхронное
});
}
var cache = {};
function longFuncWithCache(param) {
if (!cache[param]) {
cache[param] = longFunc(param);
}
return cache[param];
}
// Следующие два вызова только один раз вызовут что-то асинхронное из функции longFunc
longFuncWithCache(1).then(/*...*/);
longFuncWithCache(1).then(/*...*/);
Т.е. промис это результат асинхронной операции, с которым можно делать всё, что можно делать с обычной переменной, просто чтобы добраться до самого результата, нужно вызвать .then()
, и неважно, зарезолвился уже промис или нет.