промисы особенно мощно рулят, когда надо сделать несколько запросов, причем в каждом использовать результаты предыдущего.
традиционный подход с калбэками "вырастает вправо"
myFunc(..., function(data) {
...
myFunc2(data, function(data1) {
...
myFunc3(data1, function(data2) {
...
});
});
});
вариант с промисами остается линейным:
myFunc(...)
.then(function(data) {
...
return myFunc2(data);
})
.then(function(data) {
...
return myFunc3(data);
})
.then(function(data) {
...
return myFunc4(data);
});
здесь каждая из функций возвращает промис, и в этом случае очередной .then ждет выполнения уже этого нового промиса.
ну и есть функция Promise.all - подождать, когда выполнятся все промисы в массиве.
плюс есть обработка ошибок и исключений (второй параметр в then или первый - в методе catch).
из этих элементов можно комбинировать произвольные конструкции, которые на калбэках смотрелись бы убийственно.