Любите JS? Можете не отвечать, я знаю, что да. Сегодня мы поговорим о промисах.

Отличный материал на русском: https://learn.javascript.ru/promise

Спецификация: https://promisesaplus.com/

Ну и, конечно же, виновник сего парада - промисы в питоне: https://github.com/syrusakbary/promise

Если кратко о сути, это такой механизм написания асинхронного кода, который вызывает коллбэк, когда так или иначе заканчивает выполнение.

Пример того, как это всё работает (постарался делать строки покороче, чтобы было проще читать):

    print('ok', repr(result))

def fail_func(result):
    print('fail', repr(result))

test = lambda resolve, reject: resolve('good')
p = Promise(test)
p.then(ok_func, fail_func)
# ok 'good'

test = lambda resolve, reject: reject('bad')
p = Promise(test)
p.then(ok_func, fail_func)
# fail AssertionError('A promise was rejected with a non-error: bad',)```






Когда исполняется строчка `Promise(test)`, функция уже асинхронно вызывается. Далее мы через `.then` указываем колбэки `resolve` и `reject`. Колбэк срабатывает сразу, как выполняется оба условия:
1. Функция, переданная в promise, вызвала нужный колбэк.
2. Для промиса с помощью `.then` был указан нужный колбэк.

Важно отметить, что даже после вызова колбэка код продолжает выполняться:
```def test(resolve, reject):
    resolve('good')
    print('lol')

p = Promise(test)```



Тут уже будет выведено "lol", несмотря на то, что колбэк ещё даже не указан. Так что во избежания черной магии лучше после вызова колбэка ставить `return`.