方法 手写promise_手写async await的最简实现(20行搞定)「JS篇」

43b39b8bf4d0f841b1194a4cdd0a8535.png

作者:前端瓶子君

转发链接:https://mp.weixin.qq.com/s/em663Ctl7UxYwPWkm-hR2g

前言

如果让你手写async函数的实现,你是不是会觉得很复杂?这篇文章带你用20行搞定它的核心。

经常有人说async函数是generator函数的语法糖,那么到底是怎么样一个糖呢?让我们来一层层的剥开它的糖衣。

有的同学想说,既然用了generator函数何必还要实现async呢?

这篇文章的目的就是带大家理解清楚async和generator之间到底是如何相互协作,管理异步的。

示例

const getData = () => new Promise(resolve => setTimeout(() => resolve("data"), 1000))async function test() {  const data = await getData()  console.log('data: ', data);  const data2 = await getData()  console.log('data2: ', data2);  return 'success'}// 这样的一个函数 应该再1秒后打印data 再过一秒打印data2 最后打印successtest().then(res => console.log(res))

思路

对于这个简单的案例来说,如果我们把它用generator函数表达,会是怎么样的呢?

function* testG() {  // await被编译成了yield  const data = yield getData()  console.log('data: ', data);  const data2 = yield getData()  console.log('data2: ', data2);  return 'success'}

我们知道,generator函数是不会自动执行的,每一次调用它的next方法,会停留在下一个yield的位置。

利用这个特性,我们只要编写一个自动执行的函数,就可以让这个generator函数完全实现async函数的功能。

const getData = () => new Promise(resolve => setTimeout(() => resolve("data"), 1000))  var test = asyncToGenerator(    function* testG() {      // await被编译成了yield      const data = yield getData()      console.log('data: ', data);      const data2 = yield getData()      console.log('data2: ', data2);      return 'success'    })test().then(res => console.log(res))

那么大体上的思路已经确定了,

asyncToGenerator接受一个generator函数,返回一个promise,

关键就在于&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
async/await 是 JavaScript 中处理异步操作的一种语法糖,它使得异步代码的编写更加简洁和易读。下面是手写 async/await 的基本介绍: 1. async 函数:async 函数是一个返回 Promise 对象的函数。在函数内部,可以使用 await 关键字来等待一个 Promise 对象的状态变为 resolved(已完成)或 rejected(已拒绝),然后再继续执后面的代码。 2. await 表达式:await 关键字只能在 async 函数内部使用。它可以暂停 async 函数的执,等待一个 Promise 对象的状态变为 resolved,并返回 Promise 对象的结果值。如果 await 后面的表达式不是 Promise 对象,它会被自动转换为一个 resolved 的 Promise 对象。 下面是一个手写async/await 示例: ```javascript function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function fetchData() { try { console.log("Fetching data..."); await delay(2000); // 模拟异步操作 console.log("Data fetched!"); return "Data"; } catch (error) { console.error("Error:", error); throw error; } } async function main() { try { const data = await fetchData(); console.log("Received data:", data); } catch (error) { console.error("Error:", error); } } main(); ``` 在上面的示例中,fetchData 函数是一个异步函数,它使用了 await 关键字来等待 delay 函数返回的 Promise 对象。main 函数是程序的入口点,它使用了 async/await 来处理 fetchData 函数的返回值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值