Читая о async
и await
, я заметил, что это почти эквивалент функций-генераторов. Обратите внимание на этот фрагмент из TypeScript Deep Dive:
Асинхронное ожидание
(...)
// Not actual code. A thought experiment async function foo() { try { var val = await getMeAPromise(); console.log(val); } catch(err) { console.log('Error: ', err.message); } }
(...)
Сгенерированный JavaScript
Вам не обязательно это понимать, но это довольно просто, если вы читали о генераторах. Функцию
foo
можно просто обернуть следующим образом:const foo = wrapToReturnPromise(function* () { try { var val = yield getMeAPromise(); console.log(val); } catch(err) { console.log('Error: ', err.message); } });
где
wrapToReturnPromise
просто выполняет функцию генератора, чтобы получитьgenerator
, а затем использоватьgenerator.next()
, если значение равноpromise
, это будетthen
+catch
обещание и в зависимости от результата вызываетgenertor.next(result)
илиgenertor.throw(error)
. Вот и все!
В чем причина того, что это оказалось «новой функцией»? ИМХО, просто использовать эту функцию wrapToReturnPromise
из какой-нибудь библиотеки было бы так же хорошо, не усложняя при этом сам JavaScript.
Примечание: это связано с этим вопросом, но здесь я спрашиваю о "почему", а не "как". Я пытаюсь понять мотивы.
wrapToReturnPromise
сложен (и часто реализуется неправильно/слишком наивно) и влечет за собой больше накладных расходов, чем необходимо.async function
сawait
может лучше анализироваться и оптимизироваться движком. - person Bergi   schedule 01.03.2017async/await
не является частью ES7 (ES2016)! Это будет частью выпуска этого года, ES2017. - person Felix Kling   schedule 07.03.2017