【发布时间】:2017-11-27 19:28:24
【问题描述】:
我有一个简单的get 函数使用XMLHttpRequest,它接受一个回调参数。计划是在 onload 事件处理程序上调用回调。
这是一个简化版:
get(url,doit);
function doit(data) {
alert(data)
}
function post(url,callback) {
var xhr=new XMLHttpRequest();
xhr.onload=function() { // Version 1
callback(xhr.response)
}
xhr.onload=callback.bind(xhr,xhr.response); // Version 2
xhr.open('get',url,true);
xhr.send(data);
}
回调函数有一个参数data,应该是Ajax调用的响应。
我有 2 个调用回调的版本:
- 版本 1 只是在事件处理函数中调用回调。
- 版本2使用
bind做同样的事情;this设置为xhr对象,而xhr.response作为参数发送。
当我使用版本 1 时,一切都按预期工作。当我使用版本 2 时,data 参数为空。
我以为我对XMLHttpRequest 和.bind() 相当了解,但我无法弄清楚为什么第二个版本是空的。这里(不)发生了什么?
评论
多亏了答案,我想我知道了。
.bind() 会立即以xhr.responseText 的当前 值执行,在这个阶段,它什么都不是。
如果我需要以 future 值作为响应,第一个版本似乎更可取。
谢谢大家。
【问题讨论】:
-
当你执行
.bind(xhr,xhr.response)时还没有任何响应 ->xhr.response === undefined
标签: javascript ajax callback xmlhttprequest function-binding