最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JS为什么说async/await是generator的语法糖详解

来源:懂视网 责编:小采 时间:2020-11-27 21:53:49
文档

JS为什么说async/await是generator的语法糖详解

JS为什么说async/await是generator的语法糖详解:关于async的介绍,在阮一峰的ES6入门教程中说到: async 函数是什么?一句话,它就是 Generator 函数的语法糖。 可是,为什么这么说呢? 首先,比如说有一个异步操作,使用 async/await 语法来以同步模拟异步操作。 使用 async/await 实现一
推荐度:
导读JS为什么说async/await是generator的语法糖详解:关于async的介绍,在阮一峰的ES6入门教程中说到: async 函数是什么?一句话,它就是 Generator 函数的语法糖。 可是,为什么这么说呢? 首先,比如说有一个异步操作,使用 async/await 语法来以同步模拟异步操作。 使用 async/await 实现一

可是,为什么这么说呢?

首先,比如说有一个异步操作,使用 async/await 语法来以同步模拟异步操作。

使用 async/await 实现一个 sleep 的功能

function sleep(time) {
 return new Promise((resolve, reject) => {
 setTimeout(() => {
 resolve(1);
 }, time);
 });
}

async function test () {
 for(let i = 0; i < 10; i++) {
 let result = await sleep(1000);
 console.log(result);
 }
}

将 async/await 转成 generator 和 promise 来实现:

let test = function () {
 // ret 为一个Promise对象,因为ES6语法规定 async 函数的返回值必须是一个 promise 对象
 let ret = _asyncToGenerator(function* () {
 for (let i = 0; i < 10; i++) {
 let result = yield sleep(1000);
 console.log(result);
 }
 });
 return ret;
}();

// generator 自执行器
function _asyncToGenerator(genFn) {
 return new Promise((resolve, reject) => {
 let gen = genFn();
 function step(key, arg) {
 let info = {};
 try {
 info = gen[key](arg);
 } catch (error) {
 reject(error);
 return;
 }
 if (info.done) {
 resolve(info.value);
 } else {
 return Promise.resolve(info.value).then((v) => {
 return step('next', v);
 }, (error) => {
 return step('throw', error);
 });
 }
 }
 step('next');
 });
}

看完以上代码,是不是一目了然了啊。将 async/await 使用 generator 进行改写的关键是要使用 promise 来实现一个 generator 自执行器。在babel中,大体的原理也是类似的。

总结

文档

JS为什么说async/await是generator的语法糖详解

JS为什么说async/await是generator的语法糖详解:关于async的介绍,在阮一峰的ES6入门教程中说到: async 函数是什么?一句话,它就是 Generator 函数的语法糖。 可是,为什么这么说呢? 首先,比如说有一个异步操作,使用 async/await 语法来以同步模拟异步操作。 使用 async/await 实现一
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top