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开发网站的关键技术(Vue.js项目前端多语言方案的思路与实践)
- js实现分页
- js右下角提示框
- json的语法
- nodejs怎么查看对象的全部属性(浅谈nodejs中创建cluster)
- vue多个对象实现双向数据绑定(利用js实现Vue2.0中数据的双向绑定功能)
- 在html中使用javascript实例代码(原生 JS+CSS+HTML 实现时序图的方法)
- extjs accordion折叠布局
- js原生tab栏切换(JavaScript实现简易tab栏切换案例)
- nodejs数据采集(nodejs获取表单数据的三种方法实例)
- js的遍历数组方法(JS中数组常用的循环遍历你会几种)
- laravel 数据表格(Laravel自定义 封装便捷返回Json数据格式的引用方法)
- JS实现金额大小写转换
- jsarray操作技巧(JS数组reduce你不得不知道的25个高级用法)
- js日历图片(js实现简单日历效果)
- nodejs如何识别接口(Node实现搜索框进行模糊查询)
- 成都旅游攻略(成都旅游攻略自由行最佳线路)
- 给儿童吃什么最好(给儿童吃什么最好消化)
- 杭州旅游攻略()
- 云南旅游攻略(云南旅游攻略5天攻略)
- 收藏 春节假期,这些景区巨划算(收藏春节假期这些景区巨划算)
- 景区游玩,这些安全知识要牢记(这些安全知识要牢记)
热门推荐
- docker镜像重启数据丢失(Docker数据备份恢复实现过程详解)
- css三种布局模式(CSS实现等分布局的4种方式)
- vue2和vue3都如何创建项目(vue3.0+vite2实现动态异步组件懒加载)
- php数据错误处理函数(php中错误处理操作实例分析)
- python如何获取微信好友(利用Python查看微信共同好友功能的实现代码)
- sql启动错误代码1814(SQLMSSQLSERVER服务启动错误代码3414的解决方法)
- php中isset函数有什么功能(PHP中的empty、isset、isnull的区别与使用实例)
- mysql将字符串转换为日期的函数(Mysql中时间戳转为Date的方法示例)
- 阿里云服务器购买时考虑的因素(购买阿里云服务器后的基本安全配置)
- HTTP header中Cache-control的介绍