我有一个简单的 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 调用的响应。
我有两个调用回调的版本:
- 版本 1 只是在事件处理函数中调用回调。
- 版本 2 使用
bind
来做同样的事情;this
设置为xhr
对象,而xhr.response
作为参数发送。
当我使用版本 1 时,一切都按预期工作。当我使用版本 2 时,data
参数为空。
我以为我对 XMLHttpRequest
和 .bind()
相当了解,但我不知道为什么第二个版本是空的。这里发生(未)发生什么?
评论
多亏了这些答案,我想我明白了。
.bind()
会立即使用 xhr.responseText
的当前值执行,在这个阶段,它什么都不是。
如果我需要用 future 值进行响应,那么第一个版本似乎更可取。
谢谢大家。
最佳答案
因为callback.bind
会被立即执行。并且在执行时,xhr.responseText
显然不可用,因为请求尚未完成。您可以试试看结果。
function doit(data) {
alert(data, this.responseText);
}
关于javascript - XMLHttpRequest 和绑定(bind)回调不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44734607/