从函数块内的闭包返回数据

时间:2014-04-22 12:30:58

标签: javascript jquery ajax

我已经设置了我的JavaScript

function getData(uri) {
    var $result;
    var demoAPI = uri;
    $.getJSON(demoAPI, function(data) {
        $.each(data, function(key, val) {
            names[key] = val["name"];
            numbers.push(val["number"]);
        });
    }).done(function() {
            for(i = 0; i < names.length; i++) {
                var tmp = new Array(names[i], numbers[i]);
                result.push(tmp);
            }
            return result;
        });
}

问题是,有了这个设置,我无法使用这个功能:

var values = getData('/users');

因为return语句位于$.getJSON块内的闭包中,如果我在所述块之后调用return它返回一个空数组,因为它在ajax调用之前被调用完成了。如果我尝试使用$.ajax(),我将遇到同样的挑战。我需要帮助从函数getData()返回生成的数组。

1 个答案:

答案 0 :(得分:4)

正如您所发现的那样,您无法可靠地从异步函数返回数据。您需要传递一个回调函数,以便在收到数据时执行。试试这个:

function getData(uri, callbackFn) {
    var $result;
    $.getJSON(demoAPI, function(data) {
        $.each(data, function(key, val) {
            names[key] = val["name"];
            numbers.push(val["number"]);
        });
    }).done(function() {
            for(i = 0; i < names.length; i++) {
                var tmp = new Array(names[i], numbers[i]);
                result.push(tmp);
            }
            callbackFn(result);
        });
}

getData('/users', function(result) {
    // do what is required with the returned data...
});