Недавно пытался на пальцах объяснить отличие Future от Promise. Понятия эти очень близкие, даже статья на Wikipedia про них одна.

Как правило Future и Promise используются как контейнер, для представления данных, которых пока нет, но уже можно сформировать цепочку их обработки. Реализации, которые мне известны: Deffered в Twisted, Future в python 3, его примитивный backport в tornado и Deffered в jQuery.

Мне нравится такое определение разницы:

Future – это контейнер, на результат которого вы подписываетесь, но не управляете его появлением.

Promise – это контейнер, результат в который вы предоставляете и сами управляете его появлением в будущем.

Условно можно считать Future "переменной", а Promise "функцией по установке переменной". Логично, что во многих реализациях эти объекты порождаются парами. Иногда даже эти понятия смешивают в один контейнер, который предоставляет реализации обоих задач, например, так сделано в jQuery и python. Но даже, если реализация смешана, полезно каким-либо образом, хотя бы в соглашениях понимать имеете ли вы право "зажечь" контейнер или имеете право только подписываться на него.

За Future не нужно следить и можно считать, что код который их вернул обязательно когда-нибудь вызовет ваши callback'и. За Promise же вы ответственны и должны не забыть вызвать его в любом случае, даже если ваш код упал с какой-то ожидаемой или не ожидаемой ошибкой.