我有几个函数,它们调用另一个函数(浏览器中的集成函数),如下所示:
function getItems () {
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://another.server.tld/", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
items = $("a[href^=/courses/]", xhr.responseText);
}
};
xhr.send();
}
由于我不想在内部编写更多代码并将每个逻辑功能分开,我需要此函数来返回变量项。
我知道可能会发生一些事故(网络/服务器不可用,响应时间很长......)并且该功能可以在从服务器获取数据或发生超时后返回任何内容。
答案 0 :(得分:5)
这似乎是异步请求。我认为您无法从此功能返回数据。
相反,您可以将回调函数作为此函数的参数,并在返回响应时调用该回调。
function getItems (callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://another.server.tld/", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
callback(xhr.responseText);
}
};
xhr.send();
}
答案 1 :(得分:2)
您要求同步请求:函数不应返回,直到可以计算其返回值,即使这涉及向服务器请求数据的100毫秒。
通过将xhr.open
的第三个参数设置为true
,您正在使用异步请求 - 告知浏览器您希望函数在收到服务器响应之前返回。这几乎意味着它无法退回物品,因为它们尚未收到。
当然,使用同步请求是一个用户界面的痛苦,因为你的javascript基本上被锁定,直到几百毫秒后响应回来(如果你很幸运)。
建议正确构建JavaScript代码以考虑异步通信,并允许通过回调而不是return
返回值。你没有拥有,但最终会为你节省很多痛苦。