asynchronous/等待和ES6产出与发电机之间的差异

我正在阅读这篇精彩的文章 –

https://www.promisejs.org/generators/

它清楚地突出了这个函数,它是处理生成器函数的辅助函数:

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); } } } 

我假设或多或lessasync关键字与async/await实现的方式。 所以问题是,如果是这样的话,那么await关键字和yield关键字之间的区别是什么? await总是把事情变成一个承诺,而yield没有这样的保证? 这是我最好的猜测!

您还可以看到async / await与本文中描述“spawn”函数的生成器的yield类似: https : //jakearchibald.com/2014/es7-async-functions/

yield可以被认为是awaityield取得它的价值并将其传递给调用者。 呼叫者可以用这个值做任何事情(1)。 稍后,调用者可能会将值返回给生成器(通过generator.next() ),该值将成为yieldexpression式(2)的结果,或者会出现yieldexpression式(3)抛出的错误。

asyncawait可以被认为是使用yield 。 (1)调用者(即asyncawait驱动程序 – 类似于你发布的函数)将使用类似的algorithm将new Promise(r => r(value)值包含在promise中new Promise(r => r(value) (注意, 不是 Promise.resolve ,但是这并不是什么大不了的),然后等待承诺解决,如果满足,则将(2)中的实现值传回,如果拒绝,则抛出拒绝原因为(3)中的错误。

所以async await的效用就是这个机制,它使用yield来展开所产生的值作为承诺,并将其已解决的值传回,直到函数返回其最终值。

await关键字和yield关键字之间的区别是什么?

await关键字只能在async function使用,而yield关键字只能用在生成器function* s中。 而那些显然也是不同的 – 一个是回报承诺,另一个是回报发电机。

await总是把事情变成一个承诺,而yield没有这样的保证?

是的, await将在所等待的值上调用Promise.resolve

yield只是产生发生器之外的值。

那么,事实certificateasynchronous/等待和生成器之间有非常密切的关系。 我相信asynchronous/等待将始终build立在发电机上。 如果你看巴贝尔的方式asynchronous/等待:

巴贝尔认为:

 this.it('is a test', async function () { const foo = await 3; const bar = await new Promise(function (resolve) { resolve('7'); }); const baz = bar * foo; console.log(baz); }); 

并把它变成这个

 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; } this.it('is a test', _asyncToGenerator(function* () { // << now it's a generator const foo = yield 3; // << now it's yield not await const bar = yield new Promise(function (resolve) { resolve('7'); }); const baz = bar * foo; console.log(baz); })); 

你做math。

这使得它看起来像async关键字只是包装函数,但如果是这样的话,那么等待就会变成良品,稍后当它们成为本地时,可能会有更多的图片。