如何在普通的JS函数中使用像$ .getJSON()这样的jQuery函数?

时间:2014-08-04 23:56:57

标签: javascript jquery

我有这样的方法

            var getStatus = function (tr, startTime, endTime) {
                var toReturn ="";
                    $.getJSON('../java_output/bugs.json', function (dataOuter) {
                        //random code here//
                        //code causes changes to 'toReturn'

                    });
                return (toReturn);
            }

基本上,我调用getStatus并获取一个返回值,这取决于getJSON文件。但是,因为它是一种回调方法,我不会获得当前版本的toReturn,而是获取""作为值,因为它是如何初始化的

3 个答案:

答案 0 :(得分:2)

这是因为$.getJSON是异步调用。我认为你没有多少选择:

  1. 使用睡眠等待您收到回复,然后将其返回。这显然会挂起浏览器,直到您收到响应或错误。不是一个好选择...
  2. getStatus成为异步功能。所以让它接受一个回调函数,并将其传递给$.getJSON,或者在传递给$.getJSON的回调函数中调用它。
  3. 使用延迟对象模式。 jQuery提供它:http://api.jquery.com/category/deferred-object/。基本上你返回一个“承诺”对象。客户端可以将处理程序附加到此对象,以在“解决”或“拒绝”承诺时执行代码。在$.getJSON的处理函数中,您可以解析承诺,也可以传递响应,或者在出错时拒绝它。
  4. 另请参阅此问题,这是一个类似的案例:Wait Ajax finish to do other function

答案 1 :(得分:2)

使用回调!

var getStatus = function (tr, startTime, endTime, callback) {
    var toReturn = "";
    $.getJSON('../java_output/bugs.json', function (dataOuter) {
        //changes..
        callback(toReturn);
    });
}

然后打电话给它!

getStatus(tr, start, end, function(data) {
    //your toReturn value;
    console.log(data);
});

答案 2 :(得分:1)

尝试

        var getStatus = function (tr, startTime, endTime) {
            toReturn = new $.Deferred();
            $.getJSON("../java_output/bugs.json"
            , function (dataOuter) {
                //random code here//
                //code causes changes to 'toReturn'

                toReturn.resolve(dataOuter);
            });
            return toReturn.promise();
        };
        $.when(getStatus())
            .done(function (_toReturn) {
            // do stuff with `_toReturn` 
            console.log(_toReturn);
        });

jsfiddle http://jsfiddle.net/guest271314/355Pw/