写给小白看的JavaScript异步


Posted in Javascript onNovember 29, 2017

某天突然写了个方法要从后台调用数据,显示在前台页面,但是输出结果总是空undefined,得不到数据。多方找资料才发现,原来是入了JS异步的“坑”。

我们常常听到单线程、多线程、同步、异步这些概念,那么这些东西到底是什么呢?
那么我们先从上面那几个概念说起

单线程、多线程、同步、异步基本理解

每个正在运行的程序(即进程)至少有一个线程,被称为主线程。主线程在启动程序时被创建,用于执行main函数。

1.单线程就是只有一个主线的线程,代码从上往下顺序运行,主线程负责执行程序的所有代码(UI展现以及刷新,网络请求,本地存储等等)【一个线程要做所有的事情,想想都有点累呢】

2.多线程顾名思义,就是有多个线程的程序,可以由用户自主创建。用户自主创建的若干进程相对于主线程而言就是子线程。子线程和主线程都是独立的运行单元,各自的执行互不影响,因此能够并发执行。

光听这些干巴巴的理论是不是觉得有点晕? 巧了,我乍一看的时候也晕。

在找资料的过程中,我发现了别人的这么一个形象的比喻。

打个比方,单线程就是你去厨房又烧饭又烧菜,一个人来回跑;多线程就是两个人,一个单做饭,一个单做菜。

这么说,应该更好理解了吧?

而什么又是同步和异步呢?

我们用一个简单的生活例子来说明。

你打电话订酒店,问工作人员有没有房间,这时候,工作人员需要查找有没有房间才能回答你。

同步就是不挂电话一直等,直到工作人员告诉你有没有房间。
异步就是挂断电话,你去做别的事情,比如吃饭喝水,工作人员查到了信息再打电话告诉你。

那么我们的主题来了

JS的异步操作是怎样的呢?

JS的执行环境是单线程的,也就是说,程序顺序执行下来,一次只能执行一个任务,程序想要往下运行,就必须等待当前的任务执行完毕,不管当前的任务要执行多久(要是后面的程序急着跑出来可真的是等的很难受呢)。

为了解决后面程序等的难受的这个阻塞问题。JavaScript有一种异步处理模式,其实就是延时处理。

我们再来抛出例子来说明。

var getUserInfo = function () {
      $.getJSON("http://www.easy-mock.com/mock/5a09868228b23066479b8379/ajaxData/getUserInfo", function () {
        return data;
      });
    }
    var data = getUserInfo();
    renderUserInfo(data)

getUserInfo这个函数被调用,要取后台取数据,可能要耗费很多时间,这就要让renderUserInfo一直等着,直到取出data才能运行。幸好JS有异步操作,取数据的时候,不用renderUserInfo一直等着data取出来,而是直接执行。

这么说的话,那么这两个函数到底是什么顺序执行的呐?不急,我们来调试一下:

var getUserInfo = function () {
      console.log('aaa');
      $.getJSON("http://www.easy-mock.com/mock/5a09868228b23066479b8379/ajaxData/getUserInfo", function () {
        console.log('bbb');
        return data;
      });
    }
    var data = getUserInfo();
    console.log(data);
    console.log('ccc');
    renderUserInfo(data);

顺序执行下来的输出原以为是"aaa","bbb","ccc"吧?

然而事情并没有这么简单。我们来看一下控制台的输出:

写给小白看的JavaScript异步

输出的结果竟然不是顺序的。

也就是说函数执行到getJSON取数据的时候,程序并没有等它取出数据再执行下一步,而是跳过了取数据这一个阶段,直接执行输出data了,因此,data也为空。

这就是JS的异步机制了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
node.js中的fs.fchownSync方法使用说明
Dec 16 Javascript
jquery文档操作wrap()方法实例简述
Jan 10 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
Aug 26 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
Oct 10 Javascript
JavaScript中Window对象的属性及事件
Dec 25 Javascript
jquery代码规范让代码越来越好看
Feb 03 Javascript
js使用html2canvas实现屏幕截取的示例代码
Aug 28 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 Javascript
一篇文章弄清楚Ajax请求的五个步骤
Mar 17 Javascript
3种vue组件的书写形式
Nov 29 #Javascript
easyui下拉框动态级联加载的示例代码
Nov 29 #Javascript
纯js实现隔行变色效果
Nov 29 #Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
Nov 29 #Javascript
微信小程序使用modal组件弹出对话框功能示例
Nov 29 #Javascript
详解angularjs实现echart图表效果最简洁教程
Nov 29 #Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
Nov 29 #Javascript
You might like
理解PHP中的stdClass类
2014/04/18 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
详解js私有作用域中创建特权方法
2016/01/25 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python 递归函数详解及实例
2016/12/27 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
python编写分类决策树的代码
2017/12/21 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Python自定义一个异常类的方法
2019/06/27 Python
python爬虫 正则表达式解析
2019/09/28 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
信息管理与信息系统专业求职信
2014/06/21 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
预备党员群众意见
2015/06/01 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript