写给小白看的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 相关文章推荐
javascript开发技术大全 第4章 直接量与字符集
Jul 03 Javascript
JQuery 操作/获取table具体代码
Jun 13 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
Aug 23 Javascript
JS中图片缓冲loading技术的实例代码
Aug 29 Javascript
jquery实现图片滚动效果的简单实例
Nov 23 Javascript
JS实现仿苹果底部任务栏菜单效果代码
Aug 28 Javascript
AngularJS  $modal弹出框实例代码
Aug 24 Javascript
Angular Module声明和获取重载实例代码
Sep 14 Javascript
Javascript 实现全屏滚动实例代码
Dec 31 Javascript
Vue实现简单分页器
Dec 29 Javascript
p5.js码绘“跳动的小正方形”的实现代码
Oct 22 Javascript
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
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设计模式 Strategy(策略模式)
2011/06/26 PHP
php导入导出excel实例
2013/10/25 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
PHP实现文件上传与下载
2020/08/28 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
javascript数据类型详解
2017/02/07 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Pytorch之finetune使用详解
2020/01/18 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
eBay奥地利站:eBay.at
2019/07/24 全球购物
大学生求职信例文
2014/06/29 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
商务考察邀请函模板
2015/02/02 职场文书
HTML常用标签超详细整理
2022/03/19 HTML / CSS
windows server2008 开启端口的实现方法
2022/06/25 Servers