JS中异步和单线程是什么?一文带你快速看懂

Admin 2021-09-16 群英技术资讯 429 次浏览

    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异步和单线程的相关知识,大家可以关注群英网络其它文章。

群英智防CDN,智能加速解决方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服