我的JS笔记 -- 异步任务


JS是单线程的(所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个,叫主线程),就是说JS同一时间只能处理一件事。那么就可能出现这种情况:一件事需要花费很长时间处理,后面的事情只能等待,体验就非常差。

所以JS中将执行的任务分为两类:同步任务和异步任务。

同步任务,同步任务指的是,发出调用立即获得结果的为同步任务。同步任务会在调用之后一直等待,直到返回结果。

异步任务,异步任务指的是,发出调用,但无法立即获得结果,需要额外的操作才能得到预期的结果的为异步任务。调用之后和拿到结果之间,可以进行其他操作。

JS运行环境运行机制

  1. 所有同步任务都在主线程上执行,形成一个执行栈;
  2. 主线程之外,还存在一个任务队列(一个先进先出的队列,里面放着各种事件)。只要异步任务有了运行结果,就在任务队列之中放置一个事件;
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行;
  4. 主线程不断重复上面的第三步;

所以执行栈中的代码(同步任务),总是在读取任务队列(异步任务)之前执行

事件和回调函数

事件,所谓的事件驱动就是将一切抽象为事件。I/O操作完成是一个事件,用户点击是一个事件,Ajax完成是一个事件,一个图片加载完成是一个事件,当产生事件后,这个事件会被放入任务队列中等待被处理。

回调函数,与事件关联的函数,会在执行事件时调用。

setTimeout(fn, 1000); // 例如setTimeout时间到了就会对应一个事件,而fn就是事件执行时调用的回调函数

事件循环(event loop)

主线程只会做一件事情,就是从任务队列里面取事件、执行事件,再取事件、再执行。当任务队列为空时,就会等待直到任务队列变成非空。而且主线程只有在将当前的事件执行完成后,才会去取下一个事件。这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次循环。

setTimeout(function () {
    console.log(1);
}, 0);
console.log(2);

// 2
// 1

// setTimeout(..) 并不是直接把回调函数挂在任务队列中。它所做的是设定一个定时器。当定时器到时后,相当于产生了一个时间到了的事件,这个事件进入任务队列。这样,下个事件循环主线程会取出并执行这个事件的回调函数
// 因为主线程会先执行完执行栈中的同步任务,才会去任务队列提取事件,所以异步任务的回调函数总是在同步任务知乎执行
// 但如果任务队列中已经有多个事件排队,那么就会导致setTimeOut的函数延后运行,这就是为什么setTimeOut和setInterval不准确的原因


for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(new Date());
    }, 1000);
}
console.log(new Date());

// 先输出一个日期,一秒后再几乎同时输出五个日期,但可以看出五个日期有细微的差别,这些误差就是因为任务队列中有多个事件排队导致后边事件延迟的结果

更多文章在 这里 ,觉得不错希望点个 star

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

推荐阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,711评论 1 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,049评论 25 707
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,681评论 0 5
  • 文 | 图 诺诺妈_Fairy 唔…你冷吗? 你…你……你说呢……(抖…抖…抖) 作品名:怕冷的长颈鹿 画纸:空白...
    诺诺妈FAIRY阅读 1,787评论 3 53
  • 不是灿若云霞, 亦非莲开半夏, 白衣飘飘的冬姑娘啊, 只一个回眸,世界便一片清凉。 任它西风烈, 任它断枝离, 索...
    芣苡zx阅读 320评论 0 2