# JavaScript 异步编程

74 阅读2分钟

JavaScript 异步编程

单线程

JavaScript是单线程的

  • 同一时间只能做一件事
  • 作为浏览器脚本语言,JS主要是用户互动和操作DOM
  • 避免冲突,所以被设计为单线程

任务队列

定时器

<script>
      // 定时器 异步任务
      console.log("start");
      // setTimeout(() => {
      //   console.log("setTimeout");
      // }, 1000);
      setTimeout(() => {
        console.log("setTimeout1");
      }, 0);
      // 定时器,全部流程结束后定时器运行
      for (let i = 0; i < 1e9; i++) {
        let x = i * 2;
      }
      console.log("end");
    </script>

setTimeout将事件插入任务队列,必须等待当前代码(执行栈)执行完,主线程才会继续去执行他指定的回调函数。

setTimeout开始定时器,等待响应时间完成,插入任务队列中。如果前面还有任务则需要继续等待。

抛出错误

失败的处理 异步操作失败处理在回调模型也需要考虑。

try{
...
throw new TypeError()
}catch(){
...
}

试探这段代码是否有错误catch

什么时候需要结构化异常处理?

错误类型:

  • 语法错误
  • 逻辑错误
  • 异常错误

异常(运行时错误)错误无法控制,例如网断,异常,服务端产生等,届时可以用结构化异常处理。

如果异步返回值又依赖另一个异步返回值,回调的情况会进一步复杂。

原生Ajax中异步编程

Ajax

  • Asynchronous JavaScript and XML,异步JavaScriptXML技术
  • 用于实现服务器进行异步交互功能
  • 核心是XMLHttpRequest

浏览器提供,开发者可以使用它发出http和https请求。 不需要刷新(重新提交)页面,就可以获得最新响应。

XMLHttpRequest对象常用属性:

  • response(如果类型是Json,则可以拿到Js对象,不需要杰解析)

  • responseType(Json)

  • status(描述HTTp状态代码是属性)

XMLHttpRequest对象常用方法:

  • open()用于设置异步请求的url

  • send()用于向服务器发送请求

  • sendRequestHeader()常用配置http请求头

  • getRequestHeader()以字符串形式返回指定http头信息

  • getAllRequestHeader()以字符串形式返回完整的http头信息