Я только что читал эту фантастическую статью "Генераторы", и она ясно выделяет эту функцию, которая является вспомогательной функцией для обработки функций генератора:
function async(makeGenerator){
return function () {
var generator = makeGenerator.apply(this, arguments);
function handle(result){
// result => { done: [Boolean], value: [Object] }
if (result.done) return Promise.resolve(result.value);
return Promise.resolve(result.value).then(function (res){
return handle(generator.next(res));
}, function (err){
return handle(generator.throw(err));
});
}
try {
return handle(generator.next());
} catch (ex) {
return Promise.reject(ex);
}
}
}
который я предполагаю, более или менее соответствует способу реализации ключевого слова async
в async
/await
. Таким образом, вопрос в том, если это так, то какая разница между ключевым словом await
и ключевым словом yield
? Всегда ли await
превращает что-то в обещание, тогда как yield
не дает такой гарантии? Это мое лучшее предположение!
Вы также можете увидеть, как async
/await
похож на yield
с генераторами в этой статье, где он описывает функцию "порождения" Асинхронные функции ES7.