从回调函数返回值

时间:2011-02-04 12:04:36

标签: 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[href^=/courses/]", xhr.responseText);
        }
    };
    xhr.send();
}

由于我不想在内部编写更多代码并将每个逻辑功能分开,我需要此函数来返回变量项。

我知道可能会发生一些事故(网络/服务器不可用,响应时间很长......)并且该功能可以在从服务器获取数据或发生超时后返回任何内容。

2 个答案:

答案 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返回值。你没有拥有,但最终会为你节省很多痛苦。