В чем отличие промисов от монад?
Promise - одна из монад, где bind (>>=), упрощённо, из обещания и из последующей функции делает новое обещание, которое дожидается выполнения первого обещания и передаёт результат в следующую функцию. В итоге управление в вызывающую функцию возвращается на первом же ожидании.
Но монады есть и другие. Например Either, позволяющий выдать "ошибку", т.о. обрывая всю цепь вычислений на первой же ошибке. Или Maybe, ведущий себя аналогично Either, но не с возвратом какого-то ошибочного значения, а просто с остановкой на первом фейле. Список - тоже монада, там последующая функция будет вычислена на каждом элементе, а результате сконкатенированы.
Promise это не цепочка вызовов. Promise (в переводе "обещание") - функция вам говорит, что в данный конкретный момент она не может вам вернуть результат, но она ОБЕЩАЕТ, что через некоторое время она вам его вернет. Или вернет ошибку. Promise это инструмент, который позволяет более-менее сносно существовать асинхронному коду.