JS梳理之es6异步async await 协程 迭代器

news/2025/3/31 19:41:48/文章来源:https://www.cnblogs.com/zzholiday/p/18799042

es6异步 promise 链式调用 是对回调炼狱的一种优化
这次梳理一下async await

async function fetchData() {const response = await fetch('https://api.example.com/data');const data = await response.json();return data;
}// async 声明这是一个异步函数
// await 会暂停函数的执行
// 等待promise执行完成后 恢复函数的执行

最开始 分析一下yield 写一个yield 函数 分析一下 他和async await 之间的关联 相通处 怎么使用

function* generatorFunction() {console.log("开始");yield "第一个值"; // 暂停执行并返回 "第一个值"console.log("继续");yield "第二个值"; // 暂停执行并返回 "第二个值"console.log("结束");
}// 创建生成器
const gen = generatorFunction();  // 类似于声明一个async 函数// 第一次调用 next(),开始执行
console.log(gen.next()); // 输出: { value: '第一个值', done: false } // 第二次调用 next(),恢复执行
console.log(gen.next()); // 输出: "继续" 以及 { value: '第二个值', done: false }// 第三次调用 next(),继续执行到结束
console.log(gen.next()); // 输出: "结束" 以及 { value: undefined, done: true }// gen.next()   明确告诉生成器 可以进行下一步了
// 这个过程很像 拿到数据后的回调操作


这类我尝试了很久 我发现写不出来的原因就是 next可以传参 去改变yiled值 这个特性太强大 没这一步 async 写不出来

所以先写一个简化版的async函数


async function fetchData() {const response = await fetch('https://api.example.com/data');return response;
}function* generatorFunction() {const p = fetch('https://api.example.com/data')const data = yield preturn data
}
const gen = generatorFunction()
gen.next().value.then(res=>{gen.next(res)
})

再写一个复杂版本的async函数

function fn(val) {return new Promise((resolve, reject) => {setTimeout(() => {resolve(val * 2)}, 1000)})}
async function test(){const response1 = await fn(1)const response2 = await fn(response1)const response3 = await fn(response2)return response3
}
test()function* generatorFunction() {const response1 = yield fn(1)const response2 = yield fn(response1)const response3 = yield fn(response2)return response3
}
const gen = generatorFunction()
gen.next().value.then(res1 => {console.log(res1)gen.next(res1).value.then(res2 => {console.log(res2)gen.next(res2).value.then(res3 => {console.log(gen.next(res3))})})
})
// 在之前的基础上 封装一个模板 并返回 Promise
function fn(val) {return new Promise((resolve, reject) => {setTimeout(() => {resolve(val * 2)}, 1000)})}function* generatorFunction() {const response1 = yield fn(1)const response2 = yield fn(response1)const response3 = yield fn(response2)return response3
}
const myAsync = function (){const res = new Promise((resolve,reject)=>{const gen = generatorFunction()gen.next().value.then(res1 => {console.log(res1)gen.next(res1).value.then(res2 => {console.log(res2)gen.next(res2).value.then(res3 => {resolve(gen.next(res3).value)})})})  })return res
}
const test1 = myAsync()

async/await版本

async function asyncFn() {const num1 = await fn(1)console.log(num1) // 2const num2 = await fn(num1)console.log(num2) // 4const num3 = await fn(num2)console.log(num3) // 8return num3
}
const asyncRes = asyncFn()
console.log(asyncRes) // Promise
asyncRes.then(res => console.log(res)) // 8

https://juejin.cn/post/6844904096525189128?searchId=20250328224942ADA66AC621F51E937D30#heading-5
https://juejin.cn/post/7007031572238958629?searchId=20250328224942ADA66AC621F51E937D30#heading-12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907394.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度云同步盘 登录失败【%d】【155010】

前言全局说明百度云同步盘在2016前后升级了一次,修改了接口,但是没有发布完整安装包,当时可以自动升级来解决,后来自动升级失效,就之能手动打补丁来解决了。详细解决过程:https://www.cnblogs.com/wutou/p/18799043一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737二…

grpc实现Aop

创建项目服务端:微软官方自带的ASP.NET.Core.gRPC服务项目。 客户端:ASP.NET.Core.WebApi项目。 公共类库:主要为AOP自定义拦截器类。依赖包导入 客户端:Grpc.AspNetCore、Grpc.Core.Api、Grpc.Net.ClientFactory、Grpc.Tools。公共类库:Grpc.Core.Api公共类库项目配置 创…

Win 11 安装百度云同步盘

前言全局说明百度网盘最早出来叫“百度云管家”,可以上传下载东西,后来大概在2012年,百度云同步盘上线,后来将云管家和同步盘放到一起,叫百度云,也就是现在用的这个。下面介绍 如何在 Win11上用百度云同步盘一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737二、下载…

C语言打卡学习第7天(2025.3.26)(补发)

![](https://img2024.cnblogs.com/blog/3622651/202503/3622651- 20250329002951976-79699626.jpg)1.换个网站把题简单做了几道 2,把积存的问题好好问了一下,明天“亡羊补牢”:冒泡排序、数组指针简单用法、之前网站的简单题 明天贪一点,起码把原来网站那些题啃了

VGG

VGG 网络LRN(Local Response Normalization)来自于AlexNet现在已经不怎么使用,因为经过很多实验并没有较大的作用 conv的stride为1,padding为1 maxpool的size为2,stride为2感受野叠加 论文中一个比较重要的使用就是感受野的叠加 感受野(Receptive Field)是卷积神经网络中一…

日语声调

日语声调的记忆 方法1方法2方法3日语声调的标记方法 方法1:划线规律1:第1个音 和 第2个音不是同音 规律2:出现降音就不会升回去 规律3:“高-低”在第几个音出现,就是几型 方法2:数字

荧光灯下的“绚烂”

“绚烂”这一可以令人愉悦的词汇,在航空发动机研制过程中,却给人另外的意味。荧光检测荧光检测 荧光检测是一种在零件表面进行的无损检测,可用于检测航空发动机零部件因疲劳、撞击、机加、淬火、锻造、铸造过载等因素造成的各种裂纹、接缝等表面缺陷。 当荧光检测应用在航…

课堂里的人工智能,或者说,狂野西部闯进了教育界

诺米科托博士(Normi Coto, PhD)配图来自 Unsplash 的 Element5 Digital3 月 15 日星期六,我参加了一场名为“人文学科中的 AI”的职业发展工作坊。会场人满为患,坐满了来自弗吉尼亚州中学和高中的英语和历史老师。来自弗吉尼亚大学和朗伍德大学的教授主持了这次工作坊,主题…

LED数码管显示独立按键次数

前言 目标 2个独立按键,按下K1,数码管显示的数字加1 按下K2,数码管显示的数字减1 效果 https://www.bilibili.com/video/BV1aXo9YxEhY原理独立按键,用于控制数字的加减把完整的数字,分成若干数位显示构造一个函数 show_digit(pos,digit) , 可以在指定位置(0<=pos<=7…

Bitcoin部署到openEuler RISC-V

Bitcoin项目源码是用C++写的,我对C++以及它的编译工具又比较熟悉,这次我尝试了在openEuler RISC-V 24.09上面部署Bitcoin。网上编译Bitcoin源码的很多都是以前旧版的,旧版编译是用automake之类的工具,但是在最新版只需要用cmake就行,两者的部署方式不相同,我分别记录一下…

NVIDIA安装程序无法继续

原因 在更新驱动时,手贱,下驱动一半关闭了下载流程。导致下载失败,而且进入不了Geforece 解决方法:官网下载最新版驱动,再尝试。 如果不行,检查Windows更新,更新至最新版本 重启后如果不可行,再关闭杀毒软件,关闭防火墙,再尝试,重启再尝试。 如果还是不行,使用卸载…

锚定碳中和,三重角色重构,运营商的第四次跃迁

「 作为能源消耗大户,运营商在面对碳中和的级终命题时需要转变发展思路、转变角色定位。」5G+AI倒逼运营商基础设施建设大规模提速,运营商要更好的生存发展必须要降本提效,碳中和的大目标则要求运营商在快速发展的同时还要破解能源消耗指数级增长的魔咒——这似乎是一个不可…