JS 异步编程

38 阅读2分钟

进程:CPU资源分配 & 线程:CPU调度

进程:资源分配,(不同部门)

线程:某个应用内部,共享资源,资源调度,游戏包括打字/麦克风

  • 一个进程对应一个或多个线程

  • 映射到前端,浏览器新开一个窗口,是进程,每个tab独立分配的资源,因为一个页面卡住不会影响其他页面

Event Loop

事件循环,浏览器机制,避免javaScript单线程运行阻塞,也是异步的原理

  • JavaScript是单线程的 --> 执行代码是一个线程,只有一个调用栈
  • 异步编程 -- 运行环境提供的API是同步方式/异步方式工作
  • 浏览器并不是单线程,
  • 倒计时器 - 有一个单独的线程负责倒数,时间到了之后会把回调放入到消息队列

Eventloop,就是负责监听调用栈和消息队列,一旦调用栈为空,就会从消息队列中取出第一个回调函数,压入调用栈

回调函数

回调函数a的执行依赖函数b的结果,又不知道函数b何时执行完, 就把函数a作为参数传递给执行者,执行者执行完函数b,就执行函数a

image.jpeg

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()