iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript中异步编程的示例分析
  • 602
分享到

JavaScript中异步编程的示例分析

2023-06-15 08:06:33 602人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关javascript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目的提升开发效率,编写易维护的代码引子问题请求时候为什么页面卡死??$.ajax({ &n

这篇文章给大家分享的是有关javascript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

目的

  • 提升开发效率,编写易维护的代码

引子问题

  • 请求时候为什么页面卡死??

$.ajax({  url: "www.xx.com/api",  async: false, // true  success: function(result) {    console.log(result);  },});
  • 为什么数据更新了,DOM 却没有更新??

// 异步批量更新DOM(Vue-nextTick)// <p id="app">{{num}}</p>new Vue({  el: "#app",  data: {    num: 0,  },  mounted() {    let dom = document.getElementById("app");    while (this.num !== 100) {      this.num++;    }    console.log("Vue num=" + this.num, "DOM num=" + dom.innerhtml);    // Vue num=100,DOM num=0    // nextTick or setTimeout  },});

产生异步的原因

原因:单线程(一个时间点,只做一件事),浏览器的 js 引擎是单线程导致的。

单线程是指在 JS 引擎中负责解释和执行 IavaScript 代码的线程只有一个,不妨叫它主线程。

所谓单线程,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成再执行后面一个任务。

先看看一下浏览器内核的线程图:

JavaScript中异步编程的示例分析

其中,渲染线程和 JS 线程互斥

假设有两个函数,一个修改一个删除,同时操作一个 DOM 节点,假如有多个线程的话,两个线程一起执行,肯定就死了,就会有问题。

为什么 JS 要设计为单线程,因为浏览器的特殊环境。

单线程的优缺点:

这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段 Javascript 代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

常见的堵塞(死循环):

while (true) {}

JS 在设计之初就以运行在浏览器中的脚本语言,所以也不想搞得这么复杂,就设计成了单线程,也就是,一个时间点,只能做一件事。

为了解决单线程堵塞这个缺点:产生了异步。

拿吃泡面举例:

  • 同步:买泡面=》烧水(盯着)=》煮面=》吃泡面

  • 异步:买泡面=》烧水(水开了热水壶响-回调)=》看电视=》煮面(面好了热水壶响-回调)=》看电视=》熟了叫我=》吃泡面

看电视就是异步操作,热水壶响,就是回调函数。

异步编程

JS 中大多的代码都是同步执行的,只有极个别的函数是异步执行的,异步执行的代码,则需要异步编程。

异步代码

setTimeout(() => {  console.log("log2");}, 0);console.log("log1");// ?? log1 log2

异步代码的特点:不是立即执行,而是需要等待,在未来的某一个时间点执行。

同步代码异步代码
<script>代码网络请求(Ajax)
I/O 操作定时器(setTimeout、setInterval)
渲染操作Promise(then)

async/await

回调函数

异步代码最常见的写法就是使用回调函数。

  • Http 网络请求(请求成功、识别后执行 xx 操作)

  • DOM 事件绑定机制(用户触发事件后执行 xx 操作)

  • 定时器(setTimeout、setInterval)(在达到设定时间后执行 xx 操作)

// 注意到click方法中是一个函数而不是一个变量// 它就是回调函数$("#btn_1").click(function() {  alert("Btn 1 Clicked");});// 或者function click() {  // 它就是回调函数  alert("Btn 1 Clicked");}$("#btn_1").click(click);

回调函数的缺点也很明显,容易产生回调地狱:

JavaScript中异步编程的示例分析

异步编程的三种方式

  • callback

function getOneNews() {  $.ajax({    url: topicsUrl,    success: function(res) {      let id = res.data[0].id;      $.ajax({        url: topicOneUrl + id,        success: function(ress) {          console.log(ress);          render(ress.data);        },      });    },  });}
  • promise

function getOneNews() {  axiOS    .get(topicsUrl)    .then(function(response) {      let id = response.data.data[0].id;      return axios.get(topicOneUrl + id);    })    .then((res) => {      render(res.data.data);    })    .catch(function(error) {      console.log(error);    });}
  • async/await

async function getOneNews() {  let listData = await axios.get(topicsUrl);  let id = listData.data.data[0].id;  let data = await axios.get(topicOneUrl + id);  render(data.data.data);}

在线预览

预览地址:http://jsrun.net/s43Kp/embedded/all/light

问题??

如果多个异步代码同时存在,那么执行顺序应该是怎样的?那个先执行、那个后执行了?

宏任务和微任务

异步代码的划分,异步代码分宏任务和微任务。

宏任务(不着急)微任务(着急)
<script>整体代码Promise
setTimeout/setInterval

事件循环(Event loop)

JavaScript中异步编程的示例分析

执行顺序:

  • 执行整体代码<script>(宏任务)

  • 执行所有微任务

  • 执行一个宏任务

  • 执行渲染线程

  • 2->3->2->3...依次循环(在 2、3 步中又创建了新的宏、微任务)

重复从宏任务和微任务队列里拿出任务去执行。

总结

因为浏览器设计的原因,JS 线程和渲染线程互斥,所以 JS 线程被设计成了单线程。

因为单线程执行一些操作(如网络请求)时有堵塞的问题,所有产生了异步。

因为有了异步,所以产生了异步编程,从而有了回调函数。

因为回调函数写多了会产生回调地狱,所有又有了解决回调地狱的 Promise 写法

自 ES7 标准后有了比 Promise 更加优雅的写法 ———— async/await 写法,也是异步编程的最终解决方法。

因为 JS 的代码分为同步和异步代码,同步代码的执行顺序不必多说,自上而下的执行。

但是如果有多个异步的代码,他的执行顺序又是怎么的呢??

为了解决多个异步代码的执行顺序问了,有了事件循环(EventLoop),将异步任务区分为宏任务、微任务,依据规则依次执行。

至此 完!

练习

console.log("script start");setTimeout(function() {  console.log("timeout1");}, 10);new Promise((resolve) => {  console.log("promise1");  resolve();  setTimeout(() => console.log("timeout2"), 10);}).then(function() {  console.log("then1");});console.log("script end");

写出 log 的输出结果,并说出理由。

感谢各位的阅读!关于“JavaScript中异步编程的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: JavaScript中异步编程的示例分析

本文链接: https://www.lsjlt.com/news/279015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中异步编程的示例分析
    这篇文章给大家分享的是有关JavaScript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目的提升开发效率,编写易维护的代码引子问题请求时候为什么页面卡死??$.ajax({ &n...
    99+
    2023-06-15
  • c#中异步编程的示例分析
    这篇文章给大家分享的是有关c#中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么算异步?  广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的。在面向服务的系...
    99+
    2023-06-14
  • Promise中异步编程的示例分析
    这篇文章主要介绍Promise中异步编程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下所示://1.解决异步回调问题 //1.1 如何同步异步请求 //如...
    99+
    2024-04-02
  • JavaScript中异步的示例分析
    这篇文章将为大家详细讲解有关JavaScript中异步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、异步解决方案的进化史JavaScript的异步操作一直是...
    99+
    2024-04-02
  • Node.js中的异步编程的示例分析
    Node.js中的异步编程的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。异步编程概述曾经的单线程模型在...
    99+
    2024-04-02
  • js异步编程的示例分析
    这篇文章主要为大家展示了“js异步编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js异步编程的示例分析”这篇文章吧。异步回调是js的一大特性,理解...
    99+
    2024-04-02
  • C#异步编程的示例分析
    小编给大家分享一下C#异步编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步编程在处理并发方面被使用的越来越多,之所以说上面一句话,是为了区分多线程...
    99+
    2023-06-17
  • python中asyncio异步编程的示例分析
    这篇文章将为大家详细讲解有关python中asyncio异步编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.   想学asyncio,得先了解协程携程的意义:计算型的操...
    99+
    2023-06-14
  • C#中异步多线程的示例分析
    这篇文章主要介绍C#中异步多线程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!进程、线程1. 进程首先了解,什么是线程 即一个应用程序运行时,占用资源的综合是一个进程。Windows 任务管理器里面可以看到...
    99+
    2023-06-25
  • C#异步多线程中Thread的示例分析
    这篇文章给大家分享的是有关C#异步多线程中Thread的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Thread API这里对 Thread 的一些常用 API 进行介绍,使用一些案例进行说明。由于 T...
    99+
    2023-06-25
  • JS中异步和单线程的示例分析
    这篇文章主要介绍了JS中异步和单线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单线程但是我们在开发中,遇到请求网络,或者定时任务的时候,如果等待网络请求结束或者...
    99+
    2023-06-15
  • Ajax中同步和异步的示例分析
    小编给大家分享一下Ajax中同步和异步的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过ajax向后台发送和接收数据时...
    99+
    2024-04-02
  • JavaScript中从setTimeout与setInterval到AJAX异步的示例分析
    这篇文章主要介绍JavaScript中从setTimeout与setInterval到AJAX异步的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!setTimeout与set...
    99+
    2024-04-02
  • Nodejs中异步I/O的示例分析
    小编给大家分享一下Nodejs中异步I/O的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!“异步”这个名词其实在Node之前就已经诞生了。但是在绝大多数高...
    99+
    2023-06-14
  • Springboot中异步任务的示例分析
    小编给大家分享一下Springboot中异步任务的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步任务启动类@MapperScan("com....
    99+
    2023-06-17
  • React中setState同步和异步的示例分析
    这篇文章主要介绍React中setState同步和异步的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! React起源于Facebook的内部项目。React的出现是革命性的创新,React的是一个...
    99+
    2023-06-15
  • Node.js异步编程实例代码分析
    这篇文章主要介绍了Node.js异步编程实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node.js异步编程实例代码分析文章都会有所收获,下面我们一起来看看吧。异步编程案例一function&nbs...
    99+
    2023-07-04
  • JavaScript中时间差异的示例分析
    这篇文章主要介绍JavaScript中时间差异的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!时间差异这是一种从传统反逆向技术那里借鉴过来的基于时间的反调试技巧。当脚本在DevTools等工具环境下执行时,运...
    99+
    2023-06-27
  • JavaScript中预编译的示例分析
    小编给大家分享一下JavaScript中预编译的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JavaScript 预编...
    99+
    2024-04-02
  • JavaScript函数式编程的示例分析
    这篇文章给大家分享的是有关JavaScript函数式编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。看过许多关于函数式编程的讲解,但是其中大部分是停留在理论层面,还有...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作