Title: 阿里&字节:手写 async/await 的实现 · Issue #56 · sisterAn/JavaScript-Algorithms · GitHub
Open Graph Title: 阿里&字节:手写 async/await 的实现 · Issue #56 · sisterAn/JavaScript-Algorithms
X Title: 阿里&字节:手写 async/await 的实现 · Issue #56 · sisterAn/JavaScript-Algorithms
Description: Async是如何被 JavaScript 实现的 await 内部实现了 generator,其实 await 就是 generator 加上 Promise的语法糖,且内部实现了自动执行 generator。如果你熟悉 co 的话,其实自己就可以实现这样的语法糖。 /** * async/await 实现 * @param {*} generatorFunc */ function asyncToGenerator(generatorFunc) { // 返回的是一个...
Open Graph Description: Async是如何被 JavaScript 实现的 await 内部实现了 generator,其实 await 就是 generator 加上 Promise的语法糖,且内部实现了自动执行 generator。如果你熟悉 co 的话,其实自己就可以实现这样的语法糖。 /** * async/await 实现 * @param {*} generatorFunc */ function asy...
X Description: Async是如何被 JavaScript 实现的 await 内部实现了 generator,其实 await 就是 generator 加上 Promise的语法糖,且内部实现了自动执行 generator。如果你熟悉 co 的话,其实自己就可以实现这样的语法糖。 /** * async/await 实现 * @param {*} generatorFunc */ function asy...
Opengraph URL: https://github.com/sisterAn/JavaScript-Algorithms/issues/56
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"阿里\u0026字节:手写 async/await 的实现","articleBody":" [Async是如何被 JavaScript 实现的](https://mp.weixin.qq.com/s/P_DPkH72_1bdOl78M_ISsQ)\r\n\r\nawait 内部实现了 generator,其实 await 就是 generator 加上 Promise的语法糖,且内部实现了自动执行 generator。如果你熟悉 co 的话,其实自己就可以实现这样的语法糖。\r\n\r\n```js\r\n/**\r\n * async/await 实现\r\n * @param {*} generatorFunc \r\n */\r\nfunction asyncToGenerator(generatorFunc) {\r\n // 返回的是一个新的函数\r\n return function(...args) {\r\n // 先调用generator函数 生成迭代器\r\n // 对应 var gen = testG()\r\n const gen = generatorFunc.apply(this, args)\r\n\r\n // 返回一个promise 因为外部是用.then的方式 或者await的方式去使用这个函数的返回值的\r\n // var test = asyncToGenerator(testG)\r\n // test().then(res =\u003e console.log(res))\r\n return new Promise((resolve, reject) =\u003e {\r\n \r\n // 内部定义一个step函数 用来一步一步的跨过yield的阻碍\r\n // key有next和throw两种取值,分别对应了gen的next和throw方法\r\n // arg参数则是用来把promise resolve出来的值交给下一个yield\r\n function step(key, arg) {\r\n let genResult\r\n \r\n // 这个方法需要包裹在try catch中\r\n // 如果报错了 就把promise给reject掉 外部通过.catch可以获取到错误\r\n try {\r\n genResult = gen[key](arg)\r\n } catch (error) {\r\n return reject(error)\r\n }\r\n\r\n // gen.next() 得到的结果是一个 { value, done } 的结构\r\n const { value, done } = genResult\r\n\r\n if (done) {\r\n // 如果已经完成了 就直接resolve这个promise\r\n // 这个done是在最后一次调用next后才会为true\r\n // 以本文的例子来说 此时的结果是 { done: true, value: 'success' }\r\n // 这个value也就是generator函数最后的返回值\r\n return resolve(value)\r\n } else {\r\n // 除了最后结束的时候外,每次调用gen.next()\r\n // 其实是返回 { value: Promise, done: false } 的结构,\r\n // 这里要注意的是Promise.resolve可以接受一个promise为参数\r\n // 并且这个promise参数被resolve的时候,这个then才会被调用\r\n return Promise.resolve(\r\n // 这个value对应的是yield后面的promise\r\n value\r\n ).then(\r\n // value这个promise被resove的时候,就会执行next\r\n // 并且只要done不是true的时候 就会递归的往下解开promise\r\n // 对应gen.next().value.then(value =\u003e {\r\n // gen.next(value).value.then(value2 =\u003e {\r\n // gen.next() \r\n //\r\n // // 此时done为true了 整个promise被resolve了 \r\n // // 最外部的test().then(res =\u003e console.log(res))的then就开始执行了\r\n // })\r\n // })\r\n function onResolve(val) {\r\n step(\"next\", val)\r\n },\r\n // 如果promise被reject了 就再次进入step函数\r\n // 不同的是,这次的try catch中调用的是gen.throw(err)\r\n // 那么自然就被catch到 然后把promise给reject掉啦\r\n function onReject(err) {\r\n step(\"throw\", err)\r\n },\r\n )\r\n }\r\n }\r\n step(\"next\")\r\n })\r\n }\r\n}\r\n\r\nvar getData = () =\u003e new Promise(resolve =\u003e setTimeout(() =\u003e resolve('data'), 1000));\r\nfunction* testG() {\r\n const data = yield getData();\r\n console.log('data: ', data);\r\n const data2 = yield getData();\r\n console.log('data2: ', data2);\r\n return 'success';\r\n}\r\n\r\nvar gen = asyncToGenerator(testG);\r\ngen().then(res =\u003e console.log(res));\r\n```\r\n\r\n","author":{"url":"https://github.com/sisterAn","@type":"Person","name":"sisterAn"},"datePublished":"2020-05-28T15:03:26.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4},"url":"https://github.com/56/JavaScript-Algorithms/issues/56"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:b95125d5-d5ad-12a9-8458-1b3fb8289236 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C26C:301463:4007:4CA4:696B2F0D |
| html-safe-nonce | 273dc51a3f670b3f8337d402d9ec41ab95d0dbc0f8e7548d537bf91b19804366 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMjZDOjMwMTQ2Mzo0MDA3OjRDQTQ6Njk2QjJGMEQiLCJ2aXNpdG9yX2lkIjoiNzQ0MTUxNzgyNjk1NTQ4OTAzNyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 1f53f6f9271b7d75417411357362e91eeedc073317eeaef290f8504bea149089 |
| hovercard-subject-tag | issue:626585380 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/sisterAn/JavaScript-Algorithms/56/issue_layout |
| twitter:image | https://opengraph.githubassets.com/43be8215b101e1781e636e7e2d5efa12256286c16b0663c02af0b680dd352a6c/sisterAn/JavaScript-Algorithms/issues/56 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/43be8215b101e1781e636e7e2d5efa12256286c16b0663c02af0b680dd352a6c/sisterAn/JavaScript-Algorithms/issues/56 |
| og:image:alt | Async是如何被 JavaScript 实现的 await 内部实现了 generator,其实 await 就是 generator 加上 Promise的语法糖,且内部实现了自动执行 generator。如果你熟悉 co 的话,其实自己就可以实现这样的语法糖。 /** * async/await 实现 * @param {*} generatorFunc */ function asy... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | sisterAn |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5f99f7c1d70f01da5b93e5ca90303359738944d8ab470e396496262c66e60b8d |
| turbo-cache-control | no-preview |
| go-import | github.com/sisterAn/JavaScript-Algorithms git https://github.com/sisterAn/JavaScript-Algorithms.git |
| octolytics-dimension-user_id | 19721451 |
| octolytics-dimension-user_login | sisterAn |
| octolytics-dimension-repository_id | 252061924 |
| octolytics-dimension-repository_nwo | sisterAn/JavaScript-Algorithms |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 252061924 |
| octolytics-dimension-repository_network_root_nwo | sisterAn/JavaScript-Algorithms |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 82560a55c6b2054555076f46e683151ee28a19bc |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width