Разница между колбеками и промисами

Всем привет.
Недавно столкнулся с вопросом какая же все таки разница между колбеками и промисами.
По своему опыту понял, что в основном только в читабельности, так как оба подхода могут решить одинаковую задачу. Как по мне промисы более наглядно демонстрируют цепочку вложенностей, а колбеки создают порой лапшу, которая откровенно бесит. Хотелось бы услышать мнение уважаемых форумчан что лучше использовать и в каких случаях?

Если есть возможность использовать промисы, лучше всегда использовать промисы. Как ты верно подметил, что коллбеки что промисы решают одинаковые задачи. При этом промисы более гибкие: позволяют возвращать еще не зарезолвленное (not resolved) значение, таким образом дают другим функция работать с этим значением.

getUserInfo() // асинхронный запрос за данными
	.then(getUserPosts) // следующий запрос выполнится на основании
                        //данных, полученных в предыдущем запросе
	.then(processUserPosts) // обработка данных после 2-х связанных асинхронных запросов

Можешь поиграться со связанными промисами на демке сервера, который отдает реальные данные. В свое время делал для тренировок работы с API
Код https://github.com/podgorniy/todo-server
Демка https://hidden-brook-8135.herokuapp.com (на самой странице можно видеть код из цепочек промисов).

2 симпатии

Да, согласен, здесь промисы выигрывают. Тоже отдаю предпочтение им, но вот появился 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(), и неважно, зарезолвился уже промис или нет.