# 单线程-异步-异步方案
单线程: 只有一个线程,同一时间只能做一件事
# 为什么js只有一个线程?
避免DOM渲染冲突,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准
# 事件轮询event-loop
参考: 什么是Event Loop? (opens new window)
事件轮询是js异步的解决方案
将js的执行任务分为主线程和异步线程。同步代码直接执行,异步函数先放在异步队列中,等到同步函数执行完毕,轮询执行异步队列函数
# 异步方案
参考:
JavaScript异步问题解决方案 (opens new window)
JS高级面试 (opens new window)
- callback 回调函数
- promise
- 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Deferred 和 Promise 区别
← Promise对象 JS的堆内存和栈内存 →