JS中异步和单线程是什么?一文带你快速看懂
Admin 2021-09-16 群英技术资讯 1127 次浏览
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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。本文介绍下Vue Router的安装与使用
目录小引“类”设计模式举个例子:“原型”设计模式小结小引JavaScript 技能持有者一定有问过这个问题:JavaScript 是面向对象语言吗?你期望得到的答案应该为:“是” 或 “不是”。但是可惜,你得不到这样简单的答案!你大概了解一通之后,你会被告知:JavaScript 不是纯粹的面向对象语言!wtf!为什么
这篇文章主要介绍了vue+elementUI中表格高亮或字体颜色改变操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
这篇文章主要介绍了JavaScript 实现生命游戏的示例步骤,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下
这篇文章我们来了解JavaScript中的style,JavaScript中,我们经常需要使用style,style的意思是“样式”、“设置样式”,style属性是一个全局属性,因此对于style的使用是一定需要掌握的,对此这篇就给大家来简单的介绍一下style及其基本使用,有需要的朋友可以参考,接下来就跟随小编来一起学习一下吧!
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008