Skip to content

JavaScript 单线程模型 #29

@Calerme

Description

@Calerme

单线程模型

单个脚本只能在一个线程上运行(称为主线程)。

同步任务和异步任务

同步任务就是那些没有被挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。

异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。只有引擎认为某个异步任务可以执行了,该任务(回调)才会进入主线程执行。排在异步任务后面的代码,不用等待异步任务马上运行,也就是说,异步任务不具有“堵塞”效应。

任务队列和事件循环

JavaScript 运行时,除了一个正在运行的主线程,引擎还提供多个不同类型的任务队列,里面是各种需要当前程序处理的异步任务。

程序执行流程

  • 执行主线程中的任务
  • 等到同步任务执行完成,就会去看任务队列中的异步任务,如果满足条件,就将异步任务重新放回主线程,这时异步任务就变成同步任务了
  • 等到到执行完,下一个异步任务再进入主线程开始执行

JavaScript 使用一种轮询机制一遍又一遍检查异步任务是不是可以进入主线程,这种机制称为事件循环(Event Loop)。

异步操作的模式

回调函数

function f1(cb) {
    // ...
    cb();
}
function f2() {}

f1(f2);

事件监听

function f1() {
    setTimeout(functio n () {
        // ...
        f1.trigger('done');
    }, 1000);
}
f1.on('done', f2);

发布/订阅

jQuery.subscribe('done', f2);

function f1() {
    setTimeout(function () {
        // ...
        jQuery.publish('done');
    }, 1000);
}

// 取消订阅
jQuery.unsubscribe('done', f2);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions