在底层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. numpy函数fromfunction分析

    从函数规则创建数组是非常方便的方法.在numpy中我们常用fromfunction函数来实现这个功能. 在numpy的官网有这么一个例子. >>> def f(x,y): ... r ...

  2. Javascript之旅——第一站:从变量说起

    工作这几年,js学的不是很好,正好周末有些闲时间,索性买本<js权威指南>,大名鼎鼎的犀牛书,好好的把js深入的看一看.买过这本 书的第一印象就是贼厚,不过后面有一半部分都是参考手册. 一 ...

  3. .NET框架设计(高级框架架构模式)—钝化程序、逻辑冻结、冻结程序的延续、瞬间转移

    阅读目录: 1.开篇介绍 2.程序书签(代码书签机制) 2.1ProgramBookmark 实现(使用委托来锚点代码书签) 2.2ProgramBookmarkManager书签管理器(对象化书签集 ...

  4. 如何阻止h5body的滑动

    // 禁止 document.body.style.overflow = 'hidden'; function _preventDefault(e) { e.preventDefault(); } w ...

  5. Spark SQL 之 Performance Tuning & Distributed SQL Engine

    Spark SQL 之 Performance Tuning & Distributed SQL Engine 转载请注明出处:http://www.cnblogs.com/BYRans/ 缓 ...

  6. Java api 入门教程 之 JAVA的SYSTEM类

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. 由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类.其内部的成员变 ...

  7. Linux 开机自启动脚本详解

    以kibana为例     以下为skibana名称的脚本内容 #!/bin/bash #chkconfig: 2345 80 90 #description:kibana kibana=" ...

  8. yum简单安装apache

    yum install httpd -y chkconfig    httpd  on service httpd start  启动软件

  9. Redis-benchmark测试Redis性能

    Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能. 使用说明如下: Usage: redis-benchmark [-h <host>] ...

  10. STM32之USART库函数USART_SendData的bug

    转载自:http://www.cnblogs.com/itloverhpu/p/3250537.html 1.最近在调试ATM32F103CB时发现,一串数据的最后一个字节总是发送不出去,用的是RS4 ...