zoukankan      html  css  js  c++  java
  • 单线程、同步和异步、回调函数

    1,单线程

      java是多线程语言,js是单线程的语言,单线程意味着,如果同时有多个任务,这些任务需要进行排队,前一个任务执行完,才会执行下一个任务

    2,js为什么是单线程?

      与用途有很大的关系,js作为浏览器的脚本语言,主要实现与用户的交互,可以实现对DOM的各种操作,如果是多线程,一个增加内容,一个删除内容,那么这个DOM是添加还是删除,会带来很复杂的同步问题,所以是单线程

    3,为什么有同步任务和异步任务?

      因为js的单线程语言,需要排队,有些文档浏览或者接口请求,执行时间比较长,影响用户体验。

      主线程完全不用等文件读取完毕或者ajax加载成功,可以先挂起处于等待的任务,先运行排在后边的任务,等文件读取成功或者ajax有了结果,再之情挂起任务,因此任务分为同步任务和异步任务

    4,什么是同步和异步

      同步:主线程上的排队任务,只有一个执行完毕才会执行下一个任务(比如,网站渲染,元素渲染)

      异步:不进入主线程而进入任务队列,只有任务队列通过主线程,某个任务可以执行了,才会进入主线程(图片加载,音乐加载)

    5,异步机制?

      任务队列是个先进先出的数据结构,也是一个事件队列

      例如,文章读取也是一个异步,会添加到任务队列中,IO完成后,任务队列中会添加一个事件,表示异步完成,可进入执行栈,这时候主线程不一定有空,当主线程处理完其他任务,有空的时候就会读取任务队列,排在前面的优先处理,如果这个任务注定了回调函数,那么主线程在处理事件的时候,就会执行回调函数的代码,也就是执行异步任务

      任务循环:单线程从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新的任务,如果没有任务,就会等到有新任务

      事件循环:每个任务都是由一个任务触发的

    6,异步机制步骤?

      (1)所有同步任务都在主线程执行,行程一个执行栈

      (2)主线程之外还存在一个任务队列,只要异步任务有了结果,就会在任务队列中防治一个事件

      (3)一旦执行占中的所有同步任务执行完毕,系统就会读取任务队列,看看里边还有哪些事件,哪些对应的异步任务,于是结束等待状态,进入执行栈,开始执行

      (4)主线程不断地重复上边的第三步

    7,异步编程(需要等待但是又不能阻塞程序的时候用异步)?

      (1)回调函数(等待着被调用,先定义好函数使用时调用):作为参数传递给另一个函数,然后通过外部函数内部调用该函数,以完成某种操作

        在另一个函数完成执行后立即执行,作为参数传递给另一个函数的函数,这个回调函数会在传给的函数内部执行

        为什么使用回调?为了阻塞长时间运行的操作

      (2)事件监听

      (3)Promise对象   

  • 相关阅读:
    python基础语法_9-2函数式编程
    python基础语法_9-1闭包 装饰器补充
    python基础语法_9-0函数概念
    python基础语法_8循环语句
    python基础语法_7运算符
    python基础语法_3面向对象
    python基础语法_2基本数据类型
    python基础语法_python中的布尔类型详解
    用户需求分析
    结对编程-词频统计(北航暑期软工培训) 郑琪 李泓毅
  • 原文地址:https://www.cnblogs.com/xiaohaha668/p/12975059.html
Copyright © 2011-2022 走看看