# 单线程-异步-异步方案

单线程: 只有一个线程,同一时间只能做一件事

# 为什么js只有一个线程?

避免DOM渲染冲突,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准

# 事件轮询event-loop

参考: 什么是Event Loop? (opens new window)

事件轮询是js异步的解决方案

将js的执行任务分为主线程和异步线程。同步代码直接执行,异步函数先放在异步队列中,等到同步函数执行完毕,轮询执行异步队列函数

# 异步方案

参考:
JavaScript异步问题解决方案 (opens new window)
JS高级面试 (opens new window)

  1. callback 回调函数
  2. promise
  3. async/await

# jQuery的Deferred

jQuery1.5之后使用了使用jQuery Deferred,初步引入Promise概念

使用

function waitHandle(){
    var dtd = $.Deferred();
    var wait = function(){
        var task = function(){
            console.log('执行完成');
            dtd.resolve();
        }
        setTimeout(task,2000)
        return dtd.promise();  //注意这里返回的是promise,而不是直接返回deferred对象
    }
    return wait(dtd)
}


var w = waitHandle();   //promise对象
$.when(w).then(function(){
    console.log('ok1');
},function(){
    console.log('err1');
})
/*
只能被动监听,不能干预promise的成功和失败
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# Deferred 和 Promise 区别