封装AJAX函数的回调参数无法正常读取arg.response属性问题
问题原因
你的代码核心错误是AJAX回调的绑定逻辑写错了:
- 你写的
_xhttp.onload = lambda(_xhttp)是立刻执行lambda函数,把执行返回值赋值给onload事件,而不是把lambda作为回调函数绑定到onload事件上。 - 执行时机上,lambda是在
send()之后立刻同步运行的,此时异步GET请求还没收到服务端返回,response属性自然是空值。 - 你直接打印
arg对象能看到response属性,是因为浏览器控制台的对象打印是惰性求值:控制台只保存对象的引用,你手动点开对象展开属性时,异步请求已经完成,response已经被赋值,所以能看到最新的属性值,但同步代码执行时读取的response确实是空的。
修复方法
把onload的绑定逻辑改成把lambda作为事件回调即可,两种写法可选:
- 用匿名函数包裹回调调用
function doAjax(param, lambda) { let _xhttp = new XMLHttpRequest(); _xhttp.open("GET", param, true); _xhttp.send(); // 等onload事件触发时再执行lambda _xhttp.onload = function() { lambda(_xhttp); }; }
- 用bind方法绑定入参
_xhttp.onload = lambda.bind(null, _xhttp);
修改完成后即可正常读取到arg.response的值。
内容的提问来源于stack exchange,提问作者Jurby
相关产品推荐
相关产品推荐

