Ajax_4(进阶)同步异步+ 宏任务微任务 + Promise链 + async终极解决方案 +事件循环原理 + 综合案例

Ajax(进阶)

文章目录

  • Ajax(进阶)
      • 01-同步代码和异步代码
          • 什么是同步代码?
          • 什么是异步代码?
          • 代码阅读
      • 02-回调函数地域
          • 概念
          • 缺点
          • 代码示例
      • 03-Promise链式调用
          • 概念
          • 细节
          • 好处
          • 代码示例
      • 04-Promise链式应用
          • 代码示例
      • 05-async函数和await
          • 概念
          • 代码示例
      • 06-async和await-捕获错误
          • 语法
      • 07-事件循环(EventLoop)
          • 什么是事件循环
          • 代码体验
          • 练习
      • 08-宏任务与微任务
          • 代码示例
      • 09-经典面试题(事件循环)
      • 10-Promise.all静态方法
          • 语法
          • 代码示例
      • 11-商品分类案例
      • 12-学习反馈案例
          • 代码示例
          • 提交表单
          • 代码示例



01-同步代码和异步代码


什么是同步代码?
  1. 同步代码:逐行执行,需要原地等待结果后,才继续向下执行。

什么是异步代码?
  1. 调用后耗时,不阻塞代码继续执行,(不必原地等待),在将来完成后 触发一个回调函数

代码阅读

目标:阅读并回答代码执行和打印的顺序

<script>   
const result = 0 + 1console.log(result)setTimeout(() => {console.log(2)}, 2000)document.querySelector('.btn').addEventListener('click', () => {console.log(3)})document.body.style.backgroundColor = 'pink'console.log(4)
</script>

打印结果为: 1,4,2,点击按钮一次就打印一次3.

  • 注意,异步代码都有一个特性,那就是耗时的、事件的、通过回调函数返回值。都是异步代码。

02-回调函数地域


概念
  1. 在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地域。

缺点
  1. 可读性差
  2. 异常无法捕获
  3. 耦合性严重,牵一发动全身。

代码示例
 axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {const pname = result.data.list[0]document.querySelector('.province').innerHTML = pname// 获取第一个省份的第一个城市axios({url: 'http://hmajax.itheima.net/api/city',params: {pname}}).then(result => {const cname = result.data.list[0]document.querySelector('.city').innerHTML = cname// 获取当前城市的第一个地区名字axios({url: 'http://hmajax.itheima.net/api/area',params: {pname,cname}}).then(result => {const area = result.data.list[0]document.querySelector('.area').innerHTML = area})})}).catch(error => {console.log(error)})// 这样一来,就进入了回调地狱了,而且错误无法捕获
  • 回调地域主要就是在回调函数中,不断的使用回到函数。

03-Promise链式调用


概念
  1. 依靠then()方法 会返回一个新 生成的Promise对象特性,继续串联下一环任务,知道结束。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CI9Ao6Nx-1691654693290)(D:\桌面\笔记\Ajax笔记\my-note\Ajax04\images\2023-08-07_22-29-32.png)]

细节
  1. then()方法里面的回调函数中的返回值,会影响新生成的Promise对象最终状态和结果。

好处
  1. 通过链式通用,解决回调函数嵌套问题。

需求:把省市的嵌套结构,改成链式调用的线性结构

代码示例
 const p = new Promise((resolve, reject) => {setTimeout(() => {resolve('北京市')}, 2000)})//  2、获取省份的名字const p2 = p.then(result => {console.log(result)// 3、创建Promise对象,获取城市名字return new Promise((resolve,reject) => {setTimeout(() => {resolve(result + '---北京')},2000)})})// 4、获取城市名字p2.then(result => {console.log(result)})// then函数原地的结果是一个新的Promise对象console.log(p2 === p)  //地址不一样
</script>

04-Promise链式应用


目标:使用Promise解决链式调用,解决回调函数地域的问题。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YV7efGq0-1691654693291)(D:\桌面\笔记\Ajax笔记\my-note\Ajax04\images\2023-08-07_23-02-04.png)]

实现方式:每个Promise对象中管理一个一步任务,用then返回Promise对象,串联起来。


代码示例

需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中

 let pname = ''// 1、得到 - 获取省份Promise对象axios({ url: 'http://hmajax.itheima.net/api/province' }).then(result => {pname = result.data.list[0]document.querySelector('.province').innerHTML = pname// 2.得到 - 获取城市Promise对象return axios({ url: 'http://hmajax.itheima.net/api/city', params: { pname } })}).then(result => {const cname = result.data.list[0]document.querySelector('.city').innerHTML = cname// 3、得到 -获取地区Promise对象return axios({url: 'http://hmajax.itheima.net/api/area',params:{pname, cname}})}).then(result => {const area = result.data.list[0]document.querySelector('.area').innerHTML = area})
</script>

05-async函数和await


##### 有什么用呢?
  1. async和await关键字让我们可以用一种更简洁的方式写出基于 Promise的一异步行为,而无需刻意的链式调用Promise.
  2. 解决回调函数地狱

概念
  1. 在async函数内,使用await关键字去掉then函数,等待获取Promise对象成功状态的结果值。
  2. await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)
  3. await === Promise对象返回的成功的结果值 (resolve的值)

代码示例
 // 1.定义一个async修饰的函数async function getData() {// Promise对象的返回成功的结果被await接收。const pObj = await axios({url: 'http://hmajax.itheima.net/api/province'})const pname = pObj.data.list[0]const cObj = await axios({url: 'http://hmajax.itheima.net/api/city',params: {pname}})const cname = cObj.data.list[0]const aObj = await axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname}})const area = aObj.data.list[0]document.querySelector('.province').innerHTML = pnamedocument.querySelector('.city').innerHTML = cnamedocument.querySelector('.area').innerHTML = area}getData()

awwit会接受Promise对象返回成功的值。


06-async和await-捕获错误


  1. 使用try catch语句标记需要尝试的语句块,并指定一个出现异常时抛出的响应。
  2. 如果try里某一行代码报错后,try中剩余的代码不会执行了。
  3. catch块,接受错误信息,返回的形参可以查看详细信息。

语法
try {//要执行的代码
} catch (error) {//error接收的是,错误信息//try里的代码,如果有错误,直接进入这里执行
}

07-事件循环(EventLoop)


同步放在执行栈,异步被宿主环境读取,放在任务队列中

由于JavaScript是单线程的,(某一刻只能 执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了事件循环模型。

什么是事件循环
  1. 在执行代码和收集异步任务时,在调用栈空闲时候,反复调用任务队列里的代码执行,就叫做事件循环。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLX51V2x-1691654693291)(D:\桌面\笔记\Ajax笔记\my-note\Ajax04\images\2023-08-08_17-19-44.png)]


在JavaScript中,数据类型有分为简单数据类型和引用数据类型,当我们js引擎识别到

  • 简单数据类型 放在栈空间存储值(因为简单数据类型没有地址)
  • 引用数据类型(有地址存储在内存中),所以,引用数据类型地址放在栈空间,值放在堆空间,我们程序员能支配栈空间,堆空间由系统来支配,所以深浅考拷贝的问题就在于地址和值的问题,对于此,我们程序员只能操作引用数据类型的地址,而值,不能直接去改变,会产生很多问题。

事件循环:就是js执行机制分配好存储空间,来决定执行代码

  1. 当代码识别为简单数据类型:则将代码放在执行栈中
  2. 当代码被识别为引用数据类型(复杂数据类型),则将代码放在任务队列中
  • 当执行栈中的代码被执行完毕后,那么js执行机制会向任务队列中读取里面的任务代码,根据所需要执行的事件进行取出任务到执行栈中运行代码。执行完毕后再次读取任务队列中是否还有任务需要执行,如果还有任务,那么继续取出来运行,多次重复的读取操作,就被成为事件循环。

代码体验
    // 体验JS是单线程的,必须先遍历完,才能改变颜色document.querySelector('.time-btn').addEventListener('click', () => {for (let i = 0; i < 300000; i++) {console.log(i)}document.body.style.background = 'pink'})// 为了避免线程卡死,出现了异步代码,把耗时操作放到异步中,先保证主线程执行完所有同步代码document.querySelector('.time-btn').addEventListener('click', () => {setTimeout(() => {for (let i = 0; i < 300000; i++) {console.log(i)}}, 0)document.body.style.background = 'pink'})
<script>
console.log(1)
setTimeout(() =>{console.log(2)
},2000)
console.log(3)
//打印顺序:1,3,2console.log(1)
setTimeout(() => {console.log(2)
},0)
console.log(3)
//打印顺序还是: 1,3,2    (因为setTimeout是引用数据类型,放到任务队列中等待执行栈中的同步任务执行完,在读取任务队列中的代码执行,并且一次只能执行一个,多个的话,就重复,这样就形成了事件循环)
</script>

练习
    console.log(1)setTimeout(() => {console.log(2)}, 0)function myFn() {console.log(3)}function ajaxFn() {const xhr = new XMLHttpRequest()xhr.open('GET', 'http://hmajax.itheima.net/api/province')xhr.addEventListener('loadend', () => {console.log(4)})xhr.send()}for (let i = 0; i < 1; i++) {console.log(5)}ajaxFn()document.addEventListener('click', () => {console.log(6)})myFn()// 答1,5,3,2,4,6(不点击事件不执行)

08-宏任务与微任务


ES6之后引入了Promise对象,让JS引擎也可以发起异步任务。


异步任务分为;

宏任务:由浏览器环境执行的异步代码。

微任务:由JS引擎环境执行的代码

执行顺序:执行栈空闲时,宏任务只有等到所有的微任务执行完毕后才会到宏任务中读取任务。

任务(代码)执行所在的环境
JS脚本执行事件(script)浏览器
setTimeout/setlnterval浏览器
Ajax请求完成事件浏览器
用户交互事件浏览器

Promise本身是同步代码,而then和catch回调函数是异步的。放在微任务执行。


代码示例
    console.log(1)setTimeout(() => {console.log(2)}, 0)const p = new Promise((resolve, reject) => {resolve(3)})p.then(res => {console.log(res)})console.log(4)
  • 打印顺序为 1 4 3 2

    console.log(1)setTimeout(() => {console.log(2)},0)const p = new Promise((resolve,reject) => {console.log(3)resolve(4)})p.then(result => {console.log(result)})console.log(5)
  • 执行顺序为: 1 3 5 4 2


09-经典面试题(事件循环)


    // 目标:回答代码执行顺序console.log(1)setTimeout(() => {console.log(2)const p = new Promise(resolve => resolve(3))p.then(result => console.log(result))}, 0)const p = new Promise(resolve => {setTimeout(() => {console.log(4)}, 0)resolve(5)})p.then(result => console.log(result))const p2 = new Promise(resolve => resolve(6))p2.then(result => console.log(result))console.log(7)// 1 7 5 6 2 3 4

10-Promise.all静态方法


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpSvq3KJ-1691654693291)(D:\桌面\笔记\Ajax笔记\my-note\Ajax04\images\2023-08-10_09-11-37.png)]

需要同时结果的时候,就是用Promise.all即可。


概念: 合并多个Promise对象,等待所有同时成功完成(或某一个失败),做后续逻辑


语法
const p = Promise.all([Promise对象,Promise对象,....])
p.then(result => {//result结果:[Promise对象成功的结果,Promise对象成功的结果,...]
}).catch(error => {//第一个失败的Promise对象,抛出的异常 
})

代码示例
    // 1. 请求城市天气,得到Promise对象const bjPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '110100' } })const shPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '310100' } })const gzPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440100' } })const szPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440300' } })// 2. 使用Promise.all,合并多个Promise对象const p = Promise.all([bjPromise, shPromise, gzPromise, szPromise])p.then(result => {// 注意:结果数组顺序和合并时顺序是一致console.log(result)const htmlStr = result.map(item => {return `<li>${item.data.data.area} --- ${item.data.data.weather}</li>`}).join('')document.querySelector('.my-ul').innerHTML = htmlStr}).catch(error => {console.dir(error)})

11-商品分类案例


核心步骤:

* 1. 获取所有一级分类数据

* 2. 遍历id,创建获取二级分类请求

* 3. 合并所有二级分类Promise对象

* 4. 等待同时成功后,渲染页面

    //  1. 获取所有一级分类数据axios({ url: 'http://hmajax.itheima.net/api/category/top' }).then(result => {console.log(result)//2. 遍历id,创建获取二级分类请求const list = result.data.data.map(item => {return axios({url: 'http://hmajax.itheima.net/api/category/sub',params: {id: item.id}})})console.log(list)//3. 合并所有二级分类Promise对象   Promise 对象就是所有axios函数的返回值const p = Promise.all(list)p.then(result => {console.log(result)// 4. 等待同时成功后,渲染页面const htmlStr = result.map(item => {// 取出关键的数据对象const dataObj = item.data.datareturn `<div class="item"><h3>分类名字</h3><ul>${dataObj.children.map(item => {return `<li><a href="javascript:;"><img src="${item.picture}"><p>${item.name}</p></a></li>`}).join('')}</ul></div>`}).join('')console.log(htmlStr)document.querySelector('.sub-list').innerHTML = htmlStr})})

12-学习反馈案例


* 目标1:完成省市区下拉列表联动切换

* 1.1 设置省份下拉菜单数据

* 1.2 切换省份,设置城市下拉菜单数据,清空地区下拉菜单

* 1.3 切换城市,设置地区下拉菜单数据


代码示例
// 1.1 设置省份下拉菜单数据
axios({url: 'http://hmajax.itheima.net/api/province'
}).then(result => {console.log(result)// 数组映射const optionStr = result.data.list.map(pname => `<option value="${pname}">${pname}</option>`).join()document.querySelector('.province').innerHTML = `<option value="">省份</option>` + optionStr
})// 1.2 切换省份,设置城市下拉菜单数据,清空地区下拉菜单
document.querySelector('.province').addEventListener('change', async e => {// 立马获取到用户选择的省份名字// 拿到省份数据const result = await axios({url: 'http://hmajax.itheima.net/api/city',params: { pname: e.target.value}})const optionStr = result.data.list.map(cname => `<option value="${cname}">${cname}</option>`).join('')// 把默认的城市选项 + 下属城市数据插入到select中document.querySelector('.city').innerHTML = `<option value="">城市</option>` + optionStr// 清空地区数据document.querySelector('.area').innerHTML = `<option value="">地区</option>`
})// 1.3 切换城市,设置地区下拉菜单数据
document.querySelector('.city').addEventListener('change', async e => {const result = await axios({url: 'http://hmajax.itheima.net/api/area',params: {pname: document.querySelector('.province').value,cname: e.target.value}})console.log(result)const optionStr = result.data.list.map(aname => `<option value="${aname}">${aname}</option>`).join('')document.querySelector('.area').innerHTML = `<option value="">地区</option>` + optionStr
})
// 省市区联动效果。2023年8月10日15:36:15

提交表单

* 目标2: 收集数据提交保存

* 2.1 监听提交的点击事件

* 2.2 依靠插件收集表单元素

* 2.3 基于axios提交缓存,显示结果


代码示例
// 2.1 监听提交的点击事件
document.querySelector('.submit').addEventListener('click', async () => {// 2.2 依靠插件收集表单元素const form = document.querySelector('.info-form')const data = serialize(form, { hash: true, empty: true })console.log(data)// 2.3 基于axios提交缓存,显示结果try {const result = await axios({url: 'http://hmajax.itheima.net/api/feedback',method: 'POST',data//因为接口文档参数名和返回的结果名相同,直接传入data,data配置对象属性名和属性值相同,则简写。})console.log(result)alert(result.data.message)} catch(error) {console.dir(error)alert(error.response.data.message)}
})
  1. serialize插件的使用获取表单
  2. async和await修饰函数和获取axios异步响应返回的结果。
  3. 使用try catch(error)来抛出异常,如果响应结果出现问题,那么就返回错误信息。

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

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

相关文章

Mysql 建索引规范

索引规范 今天在建线上表的时候&#xff0c;做了一个varchar的索引&#xff0c;运维说varchar的索引会占用很大的内存。 于是 上网搜了一下建索引规范 一、建表规约 【强制】&#xff08;1&#xff09; 存储引擎必须使用InnoDB 解读&#xff1a;InnoDB支持事物、行级锁、并发…

数据结构—图的应用

6.4图的应用 概念回顾—生成树 生成树&#xff1a;所有顶点均由边连接在一起&#xff0c;但不存在回路的图。 一个图可以有许多棵不同的生成树、含有n个顶点 n-1 条边的图不一定是生成树所有生成树具有以下共同特点 生成树的顶点个数与图的顶点个数相同&#xff1b;生成树是图的…

如何运用小程序技术闭环运营链路?

如何通过线上小程序获取用户线索&#xff0c;提高企业抗风险能力&#xff0c;建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时&#xff0c;从「推广」到「转化」&#xff0c;再到最终的「留存」都是运营过程…

ABeam×Startup丨德硕管理咨询(深圳)创新研究团队前往灵境至维·既明科技进行拜访交流

近日&#xff0c;德硕管理咨询&#xff08;深圳&#xff09;&#xff08;以下简称“ABeam-SZ”&#xff09;创新研究团队一行前往灵境至维既明科技有限公司&#xff08;以下简称“灵境至维”&#xff09;进行拜访交流&#xff0c;探讨线上虚拟空间的商业模式。 现场合影 &…

前台测试转后台优化历险记,应届生薪资8K逆袭,从此扶摇直上九万里!

优橙教育每一期都会有不少从前台测试转到后台的小伙伴应邀而来&#xff0c;其实每个人的经历都是大致相同的&#xff0c;这时候肯定会有很多小伙伴问&#xff0c;为什么出来花钱出来参加培训而不是在项目上转呢&#xff1f; 或许是因为在项目上摸爬滚打太久了&#xff0c;吃不下…

Qt扫盲-QWidget理论使用总结

QWidget理论使用总结 一、概述二、顶层 控件 和子 控件三、复合控件四、自定义控件和绘制五、大小提示和大小策略六、事件七、一组函数和属性八、QWidget样式表九、透明度和双缓冲十、创建半透明窗口 一、概述 widget 是用户界面的最小单位&#xff1a;它从window系统接收鼠标…

Jsoup爬取简单信息

1. 豆瓣图书最受关注 1.1 创建SpringBoot项目或者Maven项目 1.2 引入jsoup <dependency><!-- jsoup HTML parser library https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3<…

Qt应用开发(基础篇)——堆栈窗口 QStackedWidget

一、前言 QStackedWidget继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt常用的堆栈窗口部件。 框架类QFrame介绍 QStackedWidget堆栈窗口&#xff0c;根据下标切换&#xff0c;一次显示一个小部件&#xff0c;常用于应用界面切换、图片轮询播放等场景。 二、QSt…

用Java调用C#的WebService接口

这是一个用Java调用C#版程序的例子,废话不多说,上代码: C#接口代码: using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description;[WebService(Namespace = " http://www.ta…

如何在Springboot项目中读取zip压缩包并且把文件导出成zip压缩包

文章目录 设想场景实现流程小结 设想场景 为方便老师录入大量学生图片信息&#xff0c;在添加照片时&#xff0c;学生的相关资料以身份证号码图片描述命名如 &#xff08;1231231234567一寸照片.jpg&#xff09; &#xff08;1231231234567身份证正面照片.jpg&#xff09; &am…

中小企业体育代言:探索费用策略与实际操作

随着体育市场的不断扩大和企业品牌的不断提升&#xff0c;中小型企业正逐渐将目光投向了体育明星代言&#xff0c;希望通过这一策略来提升品牌知名度、美誉度&#xff0c;进而吸引目标消费者的注意力并提升销售量。然而&#xff0c;中小型企业请体育明星代言的费用究竟是多少呢…

docker 离线模式-部署容器

有网络的情况下下载需要的镜像 比如(下面以tomcat为例子&#xff0c;其他镜像类似) docker pull tomcat打包镜像文件到本地 docker save tomcat -o tomcat.tar将tomcat.tar 上传到内网服务器&#xff08;无外网环境&#xff09; 导入镜像 docker load -i tomcat.tar创建容器…

element-ui的el-dialog,简单的封装。

el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子&#xff0c;用一个变量控制是否显示&#xff0c;再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量&#xff0c;甚至关闭之后还要清空一些变量&#xff0c;应该可以简化一点。我写…

Windows Hyper-V Ubuntu 22.04 LTS安装

文章目录 Ubuntu准备Hyper-V启用虚拟化支持services.msc 打开服务列表&#xff0c;关注Hyper-V服务是否启动打开管理器创建虚拟机 启动备份 Ubuntu 下载Ubuntu-Desktop&#xff0c;这是个iso文件。 准备 20GB以上的磁盘空间&#xff0c;ubuntu安装后的虚拟磁盘文件超过15GB一…

C/C++test两步完成CMake项目静态分析

您可能一直在静态分析中使用CMake。但您是否尝试过将Parasoft C/Ctest与CMake一起使用吗&#xff1f;以下是如何使用C/Ctest在基于CMake的项目中运行静态分析的详细说明。 CMake是用于构建、测试和打包软件的最流行的工具之一。Parasoft C/Ctest通过简化构建管理过程&#xff…

【Minecraft】Fabric Mod开发完整流程1 - 环境配置与第一个物品

前言 Fabric 是 Minecraft 一款非官方的模组 API,与 Forge mod 不同。它以轻量级和高性能为设计目标,专注于支持新版本的 Minecraft。 Fabric 和 Forge 在各自的加载编译流程上差别很大&#xff0c;所以你很难看见有同时支持二者的 mod&#xff0c;除非做了兼容性处理 Fabri…

【Java笔记】对象存储服务MinIO

1 MinIO简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是复…

mac-右键-用VSCode打开

1.点击访达&#xff0c;搜索自动操作 2.选择快速操作 3.执行shell脚本 替换代码如下&#xff1a; for f in "$" doopen -a "Visual Studio Code" "$f" donecommand s保存会出现一个弹框&#xff0c;保存为“用VSCode打开” 5.使用

基于百度语音识别API智能语音识别和字幕推荐系统——深度学习算法应用(含全部工程源码)+测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 翻译3. 格式转换4. 音频切割5. 语音识别6. 文本切割7. main函数 系统测试工程源代码下载其它资料下载 前言 本项目基于百度语音识别API&#xff0c;结合了语音识别、视频转换音频识别以及语句停顿…

【人工智能124种任务大集合】-集齐了自然语言处理(NLP),计算机视觉(CV),语音识别,多模态等任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能124种任务大集合&#xff0c;任务集合主要包括4大类&#xff1a;自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;、语音识别、多模态任务。 我这里整理了124种应用场景任…