进程:CPU资源分配 & 线程:CPU调度
进程:资源分配,(不同部门)
线程:某个应用内部,共享资源,资源调度,游戏包括打字/麦克风
-
一个进程对应一个或多个线程
-
映射到前端,浏览器新开一个窗口,是进程,每个tab独立分配的资源,因为一个页面卡住不会影响其他页面
Event Loop
事件循环,浏览器机制,避免javaScript单线程运行阻塞,也是异步的原理
- JavaScript是单线程的 --> 执行代码是一个线程,只有一个调用栈
- 异步编程 -- 运行环境提供的API是同步方式/异步方式工作
- 浏览器并不是单线程,
- 倒计时器 - 有一个单独的线程负责倒数,时间到了之后会把回调放入到消息队列
Eventloop,就是负责监听调用栈和消息队列,一旦调用栈为空,就会从消息队列中取出第一个回调函数,压入调用栈
回调函数
回调函数a的执行依赖函数b的结果,又不知道函数b何时执行完, 就把函数a作为参数传递给执行者,执行者执行完函数b,就执行函数a
Promise
对象,表示一个异步任务最终的结果成功/失败 回调方法通过.then传入
function ajax(url){
return new Promise(function(resolve, reject){
let xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'json';
xhr.onload = function(){
if(this.status == 200){
resolve(this.response)
} else {
reject(new Error(this.statusText))
}
}
xhr.send();
})
}
----------
ajax('/api').then(function(res){
console.log(res)
}, function(err){
console.log(err)
})
链式调用
promise.then()返回的是一个新的promise对象 每一个then方法,都是对上一个.then方法返回的promise对象,添加状态明确后的回调
异常处理
.catch方法,可以捕获promise链式调用上的异常 链式调用上的异常异常会一直传递
ajax('/api')
.then(function(){
})
.catch()