zoukankan      html  css  js  c++  java
  • 异步和单线程

    1、异步的使用场景

    异步:中间的步骤根本没有阻塞接下来程序的运行,

    同步:中间的步骤阻塞了后面程序的运行。

    【`alert`是同步,`setTimeout`是异步】

    JS 脚本用到异步的场景主要有三个:

    • 定时 `setTimeout` `setInverval`
    • 网络请求,如 `ajax` `<img>`加载
    • 事件绑定
    网络请求类
    //
    ajax 代码示例 console.log('start') $.get('./data1.json', function (data1) { console.log(data1) }) console.log('end') //img 代码示例(常用语打点统计) console.log('start') var img = document.createElement('img') img.onload = function () { console.log('loaded') } img.src = '/xxx.png' console.log('end')
    //事件绑定
    console.log('start')
    document.getElementById('btn1').addEventListener('click', function () {
        alert('clicked')
    })
    console.log('end')
    //定时 `setTimeout` `setInverval`
    console.log(100)
    setTimeout(function () {
        console.log(200)
    }, 1000)
    console.log(300)

    2、单线程是如何实现异步

    console.log(100)
    setTimeout(function () {
        console.log(200)
    })
    console.log(300)

    单线程:事情都是一步一步做的,不能两件事儿一起做。

    • 执行第一行,打印`100`
    • 执行`setTimeout`后,传入`setTimeout`的函数会被暂存起来,不会立即执行。
    • 执行最后一行,打印`300`
    • 待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行。(任务的封闭时间为:从放到暂存区开始计时,到任务满足条件可执行时解封)
    • 发现暂存起来的`setTimeout`中的函数无需等待时间,就立即来过来执行
    规则和上面的一样,只不过这里暂存起来的函数,需要等待 1s 之后才能被执行。
    
    ```javascript
    console.log(100)
    setTimeout(function () {
        console.log(200)
    }, 1000)
    console.log(300)
    ```
    
    下面再来一个 ajax 的例子。规则也是一样的,只不过这里暂存起来的函数,要等待网络请求返回之后才能被执行,具体时间不一定。
    
    ```javascript
    console.log(100)
    $.get('./data.json', function (data) {
        console.log(200)
    })
    console.log(300)
    ```
    
    事件绑定的实现原理,也是会把时间暂存,但是要等待用户点击只有,才能被执行。原理是一样的,因此事件绑定在原理上来说,可以算作是异步。但是从设计上来说,还是分开好理解一些。
    
    ```javascript
    console.log(100)
    $btn.click(function () {
        console.log(200)
    })
    console.log(300)
    ```
  • 相关阅读:
    【Codeforces 1172F】—Nauuo and Bug(线段树+双指针)
    【Codeforces 1172F】—Nauuo and Bug(线段树+双指针)
    【BZOJ4671】—异或图(斯特林反演+线性基)
    【BZOJ4671】—异或图(斯特林反演+线性基)
    【Codeforces #453 E】—Little Pony and Lord Tirek(线段树/均摊分析)
    【Codeforces #453 E】—Little Pony and Lord Tirek(线段树/均摊分析)
    【Codeforces 480E】—Parking Lot(线段树+单调队列)
    【Codeforces 480E】—Parking Lot(线段树+单调队列)
    web安全
    Jodd——java瑞士军刀
  • 原文地址:https://www.cnblogs.com/shary-blue/p/14021457.html
Copyright © 2011-2022 走看看