在底层C语言中,有一个非常重要而特别的概念,叫做“中断”。用比喻来说,我正在写着博客,突然我妈打个电话过来,我就离开了键盘去接电话了,然后写博客就中断了,我聊完电话回来再继续写。乍一听似乎并没有什么大不了的是吧,似乎没什么好说的。那具体在程序中怎么表现的呢?一台电视正在放着节目,我用遥控器一按,它就不得不转过来处理红外遥控的信号,要不然微有差迟的话,遥控信号就过去了,也就遥控失灵了。只有处理了这个遥控,然后它才能再转回去处理它的视频和声音。这就是中断。

在JS中,也有一个非常重要而特别的概念,叫做“异步回调”。同样用比喻来说,我给经理发了封邮件,不可能一直晾在这里干等他回邮件吧,于是我先做其它的事情,等看到邮件通知了,我再回来处理这份邮件,这就是回调。在网页程序中,最常见的回调莫过于AJAX请求了,发出了一个请求,不能让浏览器一直卡死在那里一动也不能动就等着服务器发数据回来吧,这种一收一发一般也要一两秒钟,如果是这种一卡一卡地估计就没人想用了,所以现在浏览器中绝大多数都是使用回调。

“中断”和“异步回调”有一个很相似的地方,那就是都是放下正在做的事情,先转去做另外的事情,然后再回来处理。不同的是,“中断”是被外界打断现在做的事,紧急去处理了再回来继续做,而这个紧急处理一般来说要尽量简短、耗时非常少,比如前面的电视机总不能按一下遥控就黑屏静音了半秒钟吧,所以中断函数会要求写得尽量简短。而“异步回调”则是,我知道我要等一会才能得到答复,所以我先做着其它事情的一种主动式的行为转移,等得到答案了再回来处理原来的事情。据说NodeJS可接受的并发量很高,大概就是这个原因吧,数据库反应不过来就让它慢慢来,这些人都在我这里排着队,排完一队折回来又一队。而其它后端一般是同步的,数据库不够用的时候,就像队伍排到了门口但又不能折回来,后面来的就只能到大街上等吧。

说了这么一堆,那代码是个什么样子呢?下面这个就是一个典型的C51定时器中断程序,可以看到它有 interrupt 和 3 作为标识它是一个中断程序,序号为3。但其实还有非常重要的一点是,程序任何地方都不能调用这个函数,因为“中断”是一个由外部因素(这里是定时器计数满了)引发的一个行为,硬件机制会自动触发这个函数执行,如果又允许其它程序调用那将会导致混乱。

//Timer1中断服务程序
void time1Isr() interrupt {
//重装数值
TH1 = (-)/; //定时100us
TL1 = (-)%; //翻转IO口电平 发声
if (onBeep == ){
beepC++;
if (beepC >= ){
beepC = ;
BuzzerIO =! BuzzerIO; //这里是电平翻转哦,频率快的话就能听到声音了
}
} }

JS异步回调就常见了,就是把函数放在另一个函数的参数里。这,好像是类似于“函数指针”的东西?那是不是其它语言也可以在需要的时候使用这种“异步回调”的函数?

$.post("someURL", {key:"val", key2:"val2"}, function( result ){
console.log( result );
});

C“中断” 与 JS“异步回调” 横向对比的更多相关文章

  1. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

  2. co.js异步回调原理理解

    co.js是基于es6的generator实现的,相当于generator函数的一个自动执行器 generator的简单介绍 function* fn(){ before() yield firstY ...

  3. js异步回调

    简单理解:js是单线程的,Ajax请求远程数据.IO等会很耗时,引起堵塞可能会引起反应时间太长页面失去反应. 回调:A函数作为一个参数传给B函数,执行完B后再执行A: 同步回调: function A ...

  4. 关于js 异步回调的一些方法

    http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html

  5. 浅析JS异步执行机制

    前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面.本文将针对JS异步执行机制进行一个简单的分析. 从一份代码讲起 下面是两个经典的JS定时执行函数,这两个函数的区别相信对JS有 ...

  6. Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比

    Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...

  7. node.js 使用domain模块捕获异步回调中的异常

    和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...

  8. 避免多层回调,Node.js异步库Async使用(series)

    未使用Async之前coffeescript写的代码: exports.product_file_add = (req,res) -> if !req.param('file_id') retu ...

  9. JS的异步回调函数

    hi :)几日不见,趁着周末和父母在广州走走逛逛,游山玩水,放松身心,第一天上班就被一个问题难住了,不废话,以下是关于JS函数回调方面的知识,今天的查阅看的也是一知半解,摘录下来日后慢慢琢磨! js中 ...

随机推荐

  1. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  2. CSS background-position 用法详细介绍

    语法: background-position : length || length background-position : position || position 取值: length  : ...

  3. 大话设计模式C++版——表驱动法改造简单工厂

    上回<大话设计模式C++版——简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码 ...

  4. 译:Google的大规模集群管理工具Borg(一)------ 用户视角的Borg特性

    概述 Google的Borg系统是一个集群管理工具,在它上面运行着成千上万的job,这些job来自许许多多不同的应用,并且跨越多个集群,而每个集群又由大量的机器构成. Borg通过组合准入控制,高效的 ...

  5. Appium学习实践(四)结构优化

    随着我们测试脚本中的用例越来越多,我们不可能将所有的用例都放在同一个脚本中,所以我们需要优化我们的结构.将脚本放在一个文件夹中,再通过别的脚本来执行脚本.这样,我们也可以有选择性的执行我们的脚本 先来 ...

  6. POJ3187Backward Digit Sums[杨辉三角]

    Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6350   Accepted: 36 ...

  7. Carcraft

    魔兽登录系统   创建魔兽系统相关窗体: 登录窗体(frmLogin) 注册窗体(frmRegister) 主窗体   (frmMain) 实现魔兽登录系统: 登录的界面如下 实现思路: 1.创建一个 ...

  8. [No000000]常用软件测试编译环境声明

    程序语言这东西并不重要,重要的是你用这些语言做的事情. 操作系统:WIN8.1 X64 运行库&支持库: DirectX,Microsoft Visual C++ (VC运行库包括X86版)2 ...

  9. 持久化存储——偏好设置,plist,归档---学习笔记二

    //一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundl ...

  10. HTML 学习笔记 CSS(轮廓)

    轮廓(outline)是绘制于元素周围的一条线 位于边框边缘的外围 可起到突出元素的作用 CSS outline属性规定元素轮廓的样式 颜色和宽度 话不多说 来几个例子 看一看 1:在元素周围画线 & ...