JavaScript的异步处理
Ajax
Ajax概念与工作流程
AJAX 并非编程语言,它通过浏览器内建的 XMLHttpRequest 对象(从 web 服务器请求数据),然后利用JavaScript 和 HTML DOM(显示或使用数据)。它能够不刷新页面更新网页,在页面加载后从服务器请求和接收数据,在后台向服务器发送数据。
它的工作流程:网页中发生一个事件(页面加载、按钮点击) ->
JavaScript 创建 XMLHttpRequest 对象 ->
XMLHttpRequest 对象向 web 服务器发送请求 ->
服务器处理该请求 ->
服务器将响应发送回网页 ->
JavaScript读取响应并执行正确的动作(比如更新页面)
注意:AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。
Ajax实例
1 |
|
XMLHttpRequest对象方法和属性
| 方法 | 描述 |
|---|---|
new XMLHttpRequest() |
创建新的 XMLHttpRequest 对象 |
getAllResponseHeaders() |
返回头部信息 |
open(method, url, async, user, psw) |
规定请求method:请求类型 GET 或 POSTurl:文件位置,使用的是相对路径async:true(异步)或 false(同步)user:可选的用户名称psw:可选的密码 |
send() |
将请求发送到服务器,用于 GET 请求 |
send(string) |
将请求发送到服务器,用于 POST 请求 |
onreadystatechange |
定义当 readyState 属性发生变化时被调用的函数 |
readyState |
保存 XMLHttpRequest 的状态。0:请求未初始化 1:服务器连接已建立 2:请求已收到 3:正在处理请求 4:请求已完成且响应已就绪 |
responseText/XML |
以字符串/XML返回响应数据 |
status |
返回请求的状态号:200: "OK"403: "Forbidden"404: "Not Found" |
CORS跨域
在Ajax上我们知道输入URL使用的是相对路径,这是浏览器的同源策略导致的,也就是在发送AJAX请求时,URL的域名必须和当前页面完全一致,不然会报错。这也就是跨域
Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,JavaScript将无法获取到响应的任何数据。假设本域是my.com,外域是sina.com,只要响应头Access-Control-Allow-Origin为http://my.com,或者是*,本次请求就可以成功。可见,跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin,决定权始终在对方手中。

Promise
在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现,上面的Ajax就是典型的异步操作。
Promise是另一种异步的操作
它的处理想法就是先统一执行AJAX逻辑,不关心如何处理结果,然后,根据结果是成功还是失败,在将来的某个时候调用success函数或fail函数。
1 | function test(resolve, reject) { |
最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了

再看一个:
1 | ; |
Promise还可以并行执行异步任务。