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,异步JavaScript和XML技术- 用于实现服务器进行异步交互功能
- 核心是
XMLHttpRequest
浏览器提供,开发者可以使用它发出http和https请求。 不需要刷新(重新提交)页面,就可以获得最新响应。
XMLHttpRequest对象常用属性:
-
response(如果类型是Json,则可以拿到Js对象,不需要杰解析) -
responseType(Json) -
status(描述HTTp状态代码是属性)
XMLHttpRequest对象常用方法:
-
open()用于设置异步请求的url -
send()用于向服务器发送请求 -
sendRequestHeader()常用配置http请求头 -
getRequestHeader()以字符串形式返回指定http头信息 -
getAllRequestHeader()以字符串形式返回完整的http头信息