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();
}