JS中的异步

同步与异步

先看个例子。

foo();
bar();

程序运行一般是同步的(synchronous),即按照书写的顺序执行。在上述例子中,bar 方法会在 foo 方法执行完之后,再执行。

异步

(asynchronous)与同步相对,即在前一个方法未执行完时,就开始运行后一个方法。在上述例子中,先执行 foo 方法,foo 方法没执行完,就开始执行 bar 方法。
总而言之,同步就是顺序执行,异步就是不完全按顺序执行。

异步的好处

从异步的概念中可以发现,程序异步运行,可以提高程序运行的效率,不必等一个程序跑完,再跑下一个程序,特别当这两个程序是无关的时候。两个程序在一定时间内,可以是同时运行的。写服务器的时候应该会碰到很多这样的例子。可以想象,如果服务器的程序都是同步的,那并发什么的就不存在了吧。

阻塞与非阻塞

  • 阻塞就是说一个程序没运行完,它后面的程序是无法运行的。
  • 而非阻塞则相反,一个程序如果因为各种原因(网络、代码量等)没运行完的时候,其他的程序也是可以继续运行的。

单线程与多线程

  • 单线程是指程序运行只有一个通道,不同的方法需要排队执行。
  • 而很多语言都可以提供多线程的功能,相当于开了几个通道运行程序,使得程序可以在不同的线程中运行,不会相互影响。

多线程、非阻塞、异步

从上述基本概念中可以发现,异步如果发生在多线程语言中,会十分自然且符合逻辑。异步本质上应该就是多线程语言的产物。因为只有在多线程语言中才能够实现程序之间相互不干扰,不产生阻塞。

JS 中的异步

有了上面的一些基本概念,那么下面来说说正题,JS中的异步。我们都知道 JS 是一个单线程的语言,永远只有一个通道在运行程序。那么既然它是个单线程又如何会有异步呢?JS 中所谓的异步,应该被称为伪异步(pseudo asynchronous)。这是因为 JS 语言中的异步,会产生阻塞,并会相互干扰。

模拟 JS 中异步的方法 —— setTimeout

我们来看一下 setTimeout 如何模拟 JS 中的异步。

var foo = function(){ 
    console.log('foo begins')
    setTimeout(function(){ 
        console.log('foo finishes')
 },1000)}

var bar = function(){
     console.log('bar executed')
}
foo();
bar();

上述过程执行的时候,会打印出

foo begins
bar executed
foo finishes

所以,在上述代码块中,在前一方法(foo)执行时,后一方法(bar)也可以执行。符合异步的基本概念,程序并不按顺序执行。说是模拟是因为,你可以把 console.log('foo begins')理解成会运行 1 秒的一个代码行,运行完后,会跳出foo finishes。而中间这 1 秒运行的时候,后面的 bar 方法也是可以运行的。这样就模拟了一个异步的效果。

JS 中异步的方法存在的问题 —— 阻塞与干扰

我们将上述代码块稍做修改

var foo = function(){ 
    console.log('foo begins')
    setTimeout(function(){ 
        console.log('foo finishes')
     },1000)}
var bar = function(){ 
    while(){ 
    } 
}
foo()
bar()

你会发现 1 秒之后 foo finishes并没有被打印出来。这是因为 bar 方法是个死循环,使得 js 引擎假死,导致了 foo 方法也没有被运行完。如果是多线程的异步,假死的应该是运行 bar 方法的线程,而 foo 方法仍然会按预期打印出 foo finishes。当然了,其实这个死循环也只是模拟 bar 方法块程序运行的时间将很长。实际上,如果 bar 方法运行的时间超过了 1 秒,比方说是 5 秒,那么 foo finishes也将在 5 秒之后被打印出来。这个本质上取决于 JS 单线程程序块按队列执行的特性。所以 JS 中的异步并不能像普通的异步一样,实现非阻塞和不干扰。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容