js的异步请求(浅谈JS三座大山之异步和单线程)
js的异步请求
浅谈JS三座大山之异步和单线程目录
- 单线程
- 异步
但是我们在开发中,遇到请求网络,或者定时任务的时候,如果等待网络请求结束或者定时任务结束的时候再去做其他事情,这样页面就会卡住,所以js有异步机制解决这个问题。
异步异步的特点是不会阻塞后面的代码执行,当同步任务执行完毕之后,再执行异步任务。相对的,同步会阻止代码执行。异步任务的应用主要有网络请求和定时任务。
异步是通过callback的方式实现的,在callback里面执行异步执行的代码,但是有一些场景比如我们有三个网络请求abc需要依次执行,在a的回调里发起b请求,在b的回调里发起c请求,这样会造成一种很混乱的写法,称之为回调地狱,可以试想一下,如果页面逻辑过于复杂,需要依次调用10个接口,那么代码的可读性会非常非常差,我们如果看到了别人的这种代码难免内心奔跑一万只神兽。
promise基本用法:
let fun1 = function(flag){ return new Promise((resolve,reject)=>{ if(flag){ setTimeout(() => { resolve("success") }, 1000); }else{ setTimeout(() => { reject("fail") }, 1000); } }) } fun1(true).then((res)=>{ console.log(res)//success }).catch((res)=>{ console.log(res) }) fun1(false).then((res)=>{ console.log(res) }).catch((res)=>{ console.log(res)//fail })
上面是一个最简单的promise函数,promise函数返回一个Promise对象,参数是一个函数,接收两个参数resolve和reject,这两个参数也是函数,当执行resolve()或者reject()的时候,函数返回.
如果执行了resolve(),就会在调用的时候执行then()方法,并接收resove()返回的参数;
如果执行了reject(),就会在调用的时候执行catch()方法,并接收reject()返回的参数;
用promise重新实现一下上面三个网络请求的问题:
let callService = function(url){ return new Promise((resolve,reject)=>{ axios.get(url).then((res)=>{ resolve(res) }).catch((err)=>{ reject(err) }) }) } const url1 = "/user/url1" const url2 = "/user/url2" const url3 = "/user/url3" callService(url1).then((res)=>{ // do something return callService(url2) }).then(()=>{ // do something return callService(url3) }).then((res)=>{ // do something }).catch((err)=>{ console.log(err) })
用上面的写法重新实现之后,写法上只会有一层,而不会陷入层层的回调之中。
promise.all
promise.all可以将多个promise包装成一个新的实例,成功的时候返回一个数组,谁先失败返回谁的值。
promise.all方法可以帮我们处理日常开发中多接口同时调用的处理问题。
let p1 = new Promise((resolve, reject) => { resolve('成功了') }) let p2 = new Promise((resolve, reject) => { resolve('success') }) Promise.all([p1, p2]).then((result) => { console.log(result) //['成功了', 'success'] }).catch((error) => { console.log(error) })
promise.race
这个方法的作用是多个接口赛跑,哪个跑得快就返回哪个
Promise.race([p1, p2]).then((result) => { console.log(result) }).catch((error) => { console.log(error) })
以上就是浅谈JS三座大山之异步和单线程的详细内容,更多关于JS三座大山之异步和单线程的资料请关注开心学习网其它相关文章!
- vue双向数据绑定js如何实现(纯JS如何实现vue.js下的双向绑定功能)
- js回调函数原理(关于JavaScript回调函数的深入理解)
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- js中的this与with关键字
- js轮播图片(JS实现简单图片轮播效果)
- 微信js开发教程(微信JSSDK分享功能图文实例详解)
- js实现分页
- js中this的用法
- jsp实现短信验证码(手动实现js短信验证码输入框)
- js return false的作用
- ExtJs中XTemplate使用
- react组件分析(react-diagram 序列化Json解读案例分析)
- 利用前端做扫雷游戏(js实现经典扫雷游戏)
- docker node 分阶段构建(Docker安装、创建镜像、加载并运行NodeJS程序的详细过程)
- vue.js开发网站的关键技术(Vue.js项目前端多语言方案的思路与实践)
- JS中错误处理
- 河南尉氏县因地制宜发展果蔬种植 水坡镇绿宝甜瓜变 金瓜(河南尉氏县因地制宜发展果蔬种植)
- 谢广坤,你这么欺负谢腾飞,良心不会痛吗(你这么欺负谢腾飞)
- 乡村爱情15 宋晓峰怀疑自己孩子,腾飞与姜奶奶亲子鉴定出结果(宋晓峰怀疑自己孩子)
- 《乡村爱情13》开播,新版刘能以假乱真,编剧思维进入瓶颈(新版刘能以假乱真)
- 当年的 白洋淀战神 练肌肉 嘎子哥也成为行走的荷尔蒙(当年的白洋淀战神)
- 肌肉小子陈康, 亚洲巨兽 黄哲勋,哪个才是你的菜(肌肉小子陈康亚洲巨兽)
热门推荐
- phpstudy数据库搭建教程交流(phpStudy V8如何修改数据库root密码)
- dedecms当天文章总数(dedecms5.7文章二次开发实现阅读全文功能的方法)
- typescript怎么加号(Typescript中的as、问号与感叹号详解)
- 怎么把云服务器初始化(云服务器需要重启吗?)
- C#中字符串转换成日期
- sqlserver非唯一索引汇总性能(详解SQL Server的聚焦过滤索引)
- python图文生成器(Python生成器的使用方法和示例代码)
- MVC使用HandleErrorAttribute自定义异常
- SQL Server获取时间段内的所有月份
- python装饰器语法与应用(python装饰器简介---这一篇也许就够了推荐)