4 回答

TA贡献1797条经验 获得超6个赞
这样是可以的:
a.done(() => {
console.log(a.status);//200
console.log(a);//a.readystate===4;
});
这个原因就很明显了,你直接访问的话,浏览器还未或正在发送 xhr 请求,请求还没有完成,自然是访问不到 a.status 的,要访问需要在请求完成后访问才行,jq 的 ajax.done(fn) 就是在请求完成且成功时才去执行 fn 的这个时候才能访问到数据;
如果是原生js就是要监听 onreadystatechange 事件,当 readystate 由 1到4时,请求才完成,这个时候才能访问到 a.status,虽然这个时间很短,但是你直接在请求的代码后面访问肯定是不行的,jq 的 .done 然后就相当于在请求完成后且成功时才调用里面的回调,原理是一样的;
你看截图:
最初直接访问 a ,readystate 为 1;
请求成功后访问 a ,readystate 为 4;

TA贡献1848条经验 获得超2个赞
的确是因为异步造成的。你执行console.log()方法的时候,ajax还没有成功返回.所以是undefined,至于为什么你控制台展开能看到status为200,其实很简单。chrome控制台显示的a是一个指针,当你展开时,它才取访问它的值。而当你点击展开时,ajax早已经成功返回了。
你看,当你打印时,状态还是1,
当你点击展开后,状态为4,说明AJAX已执行成功

TA贡献1828条经验 获得超13个赞
添加回答
举报