Любите 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`.