Javascript 从回调函数返回值
我有几个函数,它们调用另一个(浏览器中的集成函数),类似这样:Javascript 从回调函数返回值,javascript,callback,Javascript,Callback,我有几个函数,它们调用另一个(浏览器中的集成函数),类似这样: function getItems () { var xhr = new XMLHttpRequest(); xhr.open("GET", "http://another.server.tld/", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { items = $("a[
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();
}
由于我不想在内部编写更多代码并将每个逻辑功能分开,所以我需要这个函数来返回变量项
我知道可能会发生一些事故(网络/服务器不可用,响应时间长…),函数可以在从服务器获取数据或超时后返回任何内容。这似乎是一个异步请求。我认为您无法从该函数返回数据 相反,您可以将回调函数作为此函数的参数,并在返回响应时调用该回调函数 例子:
您请求的是同步请求:在计算返回值之前,函数不应该返回,即使这需要向服务器请求100毫秒的数据 通过将
xhr.open
的第三个参数设置为true
,您使用的是异步请求-告诉浏览器您希望函数在收到服务器响应之前返回。这几乎意味着它无法退回这些物品,因为它们尚未收到
当然,使用同步请求是一个用户界面难题,因为javascript基本上被锁定,直到几百毫秒后响应返回(如果幸运的话)
建议您正确构建JavaScript代码,以考虑异步通信,并允许通过回调而不是
return
返回值。你不必这么做,但最终会为你省去很多痛苦。我认为回调不会返回任何结果:(这是一个好主意,我认为必须有一个解决方案:-)在这里问了很多问题后,我从经验中知道,像这样的回答,如果响应者不包含实际代码来演示所说的内容,那么它们通常是没有帮助的。
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();
}