JS中异步和单线程是什么?一文带你快速看懂
Admin 2021-09-16 群英技术资讯 593 次浏览
JS中异步和单线程是什么?对于新手来说,可能不是很了解异步和单线程,因此下文小编就给大家来简单的介绍一下什么是异步和单线程,对帮大家学习和理解JavaScript的异步和单线程一定的帮助,感兴趣的朋友就继续往下看吧。
但是我们在开发中,遇到请求网络,或者定时任务的时候,如果等待网络请求结束或者定时任务结束的时候再去做其他事情,这样页面就会卡住,所以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异步和单线程是什么应该都有一定的了解了吧,上述示例有一定的借鉴价值,有需要的朋友可以参考,希望对大家学习JavaScript有帮助,想要了解更多JS异步和单线程的相关知识,大家可以关注群英网络其它文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
简介Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥。目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端、服务端利用DH算法交换对称密钥。下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API。数论基础要理解DH算法,需要掌握一定的数论基础。感兴趣的可以进一步研究推导过程,或者直接记
ES6提供了更接近面向对象(注意:javascript本质上是基于对象的语言)语言的写法,引入了Class(类)这个概念,作为对象的模板,下面这篇文章主要给大家介绍了关于JavaScript ES6中class定义类的相关资料,需要的朋友可以参考下
函数参数是函数内部跟函数外部沟通的桥梁。下面本篇文章就来带大家了解一下JavaScript函数中的参数,希望对大家有所帮助!
这篇文章主要给大家分享用vue框架实现简单的计数器,也就是在给定的数字范围可以增加或者减少数字,超出范围就提示,下文有实现代码和效果,感兴趣的朋友可以参考,接下来我们一起来学习一下吧。
今天给大家分享的是关于vue修饰符及用法的内容,本文提到的vue修饰符小编觉得比较实用,也是面试常考的vue修饰符,因此分享给大家做个参考,接下来跟随小编一起看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008