この素晴らしい記事 «ジェネレーター» を読んでいたところ、ジェネレーター関数を処理するためのヘルパー関数であるこの関数が明確に強調されています。
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
については、彼が 'spawn' 関数ES7 async functionsについて説明しているこの記事で確認できます。