JavaScript异步编程是什么? 异步编程都有哪些解决方案?

异步编程是什么?https://blog.csdn.net/li123128/article/details/80650256异步编程都有哪些解决方案?回调函数(callback)–例:ajax优点:是简单、容易理解和实现。缺点:是不利于代码的阅读和维护,各个部分之间高度耦合,使得程序结构混乱、流程难以追踪(尤其是多个回调函数嵌套造成回调地狱的情况),而且每个任务只能指定一个回调函数...
摘要由CSDN通过智能技术生成

前言

身为前端,一直都知道异步编程怎么用,但是都没有记录过,此系列详细介绍一下我所理解的javascript中的异步编程。
链接扩展:
异步编程之–深度理解Promise
异步编程之–理解es6的Generators(生成器 )
异步编程之–理解es6中的Iterator(迭代器)

正文

异步编程是什么?为什么要使用异步编程?

我们都知道,javascript从诞生之日起就是一门单线程的非阻塞的脚本语言。这是由其最初的用途来决定的:与浏览器交互。

javascripty有两大特点:单线程+非阻塞

  • 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务。单线程是必要的,也是javascript这门语言的基石,原因在其最初也是最主要的执行环境——浏览器中,我们需要进行各种各样的dom操作。

  • 试想一下 如果javascript是多线程的,那么当两个线程同时对dom进行一项操作,例如一个向其添加事件,而另一个删除了这个dom,此时该如何处理呢?因此,为了保证不会 发生类似于这个例子中的情景,javascript选择只用一个主线程来执行代码,这样就保证了程序执行的一致性。

  • 现如今人们也意识到,单线程在保证了执行顺序的同时也限制了javascript的效率,因此开发出了web worker技术。这项技术号称让javascript成为一门多线程语言。

  • 然而,使用web worker技术开的多线程有着诸多限制,例如:所有新线程都受主线程的完全控制,不能独立执行。这意味着这些“线程” 实际上应属于主线程的子线程。另外,这些子线程并没有执行I/O操作的权限,只能为主线程分担一些诸如计算等任务。所以严格来讲这些线程并没有完整的功能,也因此这项技术并非改变了javascript语言的单线程本质。

  • 单线程就好像100个人在1个售票窗口买票,而多线程就好像100个人在100个窗口买票。但是js的特点决定了不能多线程,所以衍生了单线程+非阻塞。

  • 而非阻塞则是当代码需要进行一项异步任务(无法立刻返回结果,需要花一定时间才能返回的任务,如I/O事件,ajax)的时候,主线程会挂起(pending)这个任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。

  • 这种就好像:100个人去买票,车站开放了1个窗口,但是车票的预订可以在网上或其他地方完成,到车站时候只需要排队取票。我们可以看到,开1个窗口,就相当于只有1个线程。然后把耗时的一些操作分成两部分,先把快速能做完的事情做了,这样保证它不会阻塞其他代码的运行。剩下耗时的部分再单独执行。这就是单线程阻塞式的异步实现机制。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值