C“中断” 与 JS“异步回调” 横向对比
在底层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“异步回调” 横向对比的更多相关文章
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...
- co.js异步回调原理理解
co.js是基于es6的generator实现的,相当于generator函数的一个自动执行器 generator的简单介绍 function* fn(){ before() yield firstY ...
- js异步回调
简单理解:js是单线程的,Ajax请求远程数据.IO等会很耗时,引起堵塞可能会引起反应时间太长页面失去反应. 回调:A函数作为一个参数传给B函数,执行完B后再执行A: 同步回调: function A ...
- 关于js 异步回调的一些方法
http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
- 浅析JS异步执行机制
前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面.本文将针对JS异步执行机制进行一个简单的分析. 从一份代码讲起 下面是两个经典的JS定时执行函数,这两个函数的区别相信对JS有 ...
- Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比
Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...
- node.js 使用domain模块捕获异步回调中的异常
和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...
- 避免多层回调,Node.js异步库Async使用(series)
未使用Async之前coffeescript写的代码: exports.product_file_add = (req,res) -> if !req.param('file_id') retu ...
- JS的异步回调函数
hi :)几日不见,趁着周末和父母在广州走走逛逛,游山玩水,放松身心,第一天上班就被一个问题难住了,不废话,以下是关于JS函数回调方面的知识,今天的查阅看的也是一知半解,摘录下来日后慢慢琢磨! js中 ...
随机推荐
- MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息
Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.ComponentModel.DataAnnotations提供的很多的验证规则(Required, StringLe ...
- Python运算符,python入门到精通[五]
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运算符.赋值运 ...
- ELK Kafka json to elk
Logstash配置 input { kafka { zk_connect => "127.0.0.1:2181" topic_id => "clus ...
- 大话设计模式C++版——建造者模式
日常做菜的过程中,经常会有忘记放盐或者放2次盐的经历,最后导致好好的一盘菜让大家无从下口.这个时候就需要用到建造者模式来规范炒菜的过程,来保证每一道菜都会经历加油.放食物.放盐.放味精这4道基本的工序 ...
- git 学习使用总结三(远程仓库操作)
这篇文章仅供自己以后翻阅加深记忆,要系统的学习 git 教程(中文版),请移步到 liaoxuefeng.com 学习 git 教程部分. pull, fetch, clone, push, chec ...
- 关于log4j的讨论
1.LoggersLoggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ...
- AJAX、JQUERY 工作遇到的知识点
泽浜商城关联公司知识点总结 1.关联公司的时候,根据用户ID,在数据库中用户表中关联公司ID,公司的列表通过查找公司表 ,然后抓取所有公司的名称和ID.关联的时候只需要根据公司name和ID进行关联. ...
- Android应用程序(APK)的编译打包过程
(9878) (7) 现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的 ...
- 应用多个icon的对比
在给应用设计图标的时候,可能会遇到这样的需求,应用图标有老版和新版两种,而又想在桌面上同时显示这两个图标以对比效果. 一个应用本身只有一个自己的icon,在AndroidManifest.xml文件中 ...
- git删除远程仓库的文件或目录
git rm -r --cached a/2.txt //删除a目录下的2.txt文件 删除a目录git rm -r --cached a git commit -m "删除a目录下的2 ...