我已经阅读了几个使用JavaScript生成器的代码示例,例如这个.我能想到的最简单的生成器使用块是这样的:
function read(path) {
return function (done) {
fs.readFile(path, "file", done);
}
}
co(function *() {
console.log( yield read("file") );
})();
Run Code Online (Sandbox Code Playgroud)
这确实打印出了内容file,但我的挂断是在哪里done调用.看起来,yield是一个语法糖,用于包装它在回调中返回的内容并适当地分配结果值(至少在co将错误参数抛给回调的情况下).我对语法的理解是否正确?
使用done时看起来像什么yield?
在阅读async和时await,我注意到它几乎相当于发电机功能.考虑来自TypeScript Deep Dive的这个片段:
异步等待
(......)
Run Code Online (Sandbox Code Playgroud)// 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可以简单地包装如下:Run Code Online (Sandbox Code Playgroud)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)或 …
javascript language-design generator async-await ecmascript-2017