JS是单线程的语言,也就是说同一时间只会执行一行程序,所以如果一段程序执行过久就会造成阻塞(blocking)的现象,必须等到它结束后才能执行下一段程序。

举个例子来说,如果我们今天要买便当,但是老板说要十分钟才会好,那难道我们这十分钟内都不能做任何事情吗?

当然不是,JS本身有非同步执行的功能,也是就说我们会先跟这个函式说,你先到旁边继续跑,好了在「回来呼叫」我,我先继续跑其他程序。

有没有看到熟悉的关键字「回来呼叫」,没错非同步执行基本上都是利用callback达成。

举个例子来说,我们今天想要某个函式两秒后在执行,可以这样写:

function funA(){

console.log(“funA”);

}

function funB(){

console.log(“funB”);

}

setTimeout(funA,2000);

funB();

//funB

//funA

但是callback作非同步会发现有一个问题,假设我们今天要:

监听一个按钮

点击后延迟一秒

向API发送请求(wowgoldfine)

btn.addEventListener(“click”,function(){

setTimeout(function(){

var oReqSec = new XMLHttpRequest();

var url = 'https://devche.com/api/speech/data';

oReqSec.addEventListener(“load”,functiion(){

if(this.resp onseText){

console.log('success');

}

});

oReqSec.open(“GET”,url);

oReq.send();

},1000);

})

有注意到,那恐怖的巢状结构了吗?这个我们通常称为回呼地狱(callback hell)。

但是其可怕之处并不是在于巢状结构,而是在于如果其中一个callback出了问题,不论是自己还是别人都难以debug。

这个例子或许比较不好懂,那我们换一个简单的来看:

doA(function(){

doB()

doC(function(){

doD(function(){

doE();

})

})

})

当今天里面有个非同步函式出问题的话,有办法在短时间内找到吗?

肯定是没有办法的吧!

所以很多人都会拿这张波动拳图片来戏称回呼地狱

那到底要怎么解决这个问题呢?

JS在ES6时候提出了Promise语法,虽然底层还是用callback,但却大大解决了这个回呼地狱的问题。

至于怎么做?我们会在明天一一解析。(yfxj.net)

学JS的心路历程 -非同步执行的更多相关文章

  1. 学JS的心路历程-闭包closure

    闭包是是纯函式语言的一个特性,也是JS的一个关键性的特色,虽然不了解也能开发程序,但我们不是这种人对吧? 闭包不仅可以减少某些高阶功能的代码数量和复杂度,并且可以让我们做到原本无法做的复杂功能.听到这 ...

  2. 学JS的心路历程-正规表达式Regular Expression

    今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例. 假设需要判断输入字串是否含有“apple”: var text=“A apple a day keeps the doctor a ...

  3. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  4. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...

  5. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  6. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  7. 学JS的心路历程-JS支持面向对象?(一)

    昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...

  8. 学JS的心路历程-Promise(三)

    今天我们来说then一些特殊情况以及Promise.all()与Promise.race(). 我们都知道函式作为参数传入时,可以参照的方式传入,也能传入时执行拿回传值作使用: function us ...

  9. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

随机推荐

  1. 学习js第二天小结

    if-else if       ---------适用于区间范围的判断 If(判断条件--一般是boolean类型的值或是关系表达式或是逻辑表达式 ){ 要执行的代码; }else if(判断条件) ...

  2. redis中key过期事件

    刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息. 从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时 ...

  3. appium运行时每次默认弹出appiumsetting与unlock重装,关闭这两个步骤的方法

    找到appium安装目录,可以在 appium 源码里(C:\Program Files (x86)\Appium\node_modules\appium\lib\devices\android)注释 ...

  4. mac“打不开身份不明的开发者”

    在mac安装软件发现这样的提示 解决方法: 打开系统偏好设置-->安全与隐私-->通用-->选择任何来源 不能选择的话点击按钮锁即可编辑 没有“任何来源”选项(比如我的mac) 打开 ...

  5. thinkphp 5 wherein

    $details = Db::name('food') -> alias('a') -> field('a.food_code,a.food_name,a.food_u1,a.food_p ...

  6. spring boot js 文件引用 单引问题。

    首页 index.html 访问首页空白 . F12 控制台看页面元素布局.发现有两个body 标签 ,而且 </head> 标红. 各种检查....好像是没有问题. 但就是访问空白.去掉 ...

  7. centos7.5下安装teamview

    centos7.5下安装teamview, 1 安装 wget https://download.teamviewer.com/download/linux/teamviewer-host.x86_6 ...

  8. gzip1

    经过GZIP压缩后页面大小可以变为原来的30%甚至更小.要实现GZIP压缩页面需要浏览器和服务器共同支持, 实际上就是服务器压缩,传到浏览器后浏览器解压并解析.浏览器那边不需要我们担心,因为现在绝大多 ...

  9. Hive Ntile分析函数学习

    NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前记录所在的切片值 NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid O ...

  10. maven 插件深入了解

    http://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin http://www.infoq.com/cn/news/2011/05/xxb-mav ...