如何从包含$ .get()请求的函数返回javascript变量

时间:2013-01-03 11:52:31

标签: javascript jquery

我试过谷歌搜索但无法重新获得它。这对其他人来说似乎是一个非常简单的问题,但我对它感到困惑。我有以下代码,我在第一个警报中未定义,但我仍然在第二个警报中获得正确的值。但是,如果我注释掉第一个警报(只是警报线),那么第二个警报输出将变为未定义。任何人都可以解释为什么会这样,以及如何在没有第一个警报的情况下正确输出第二个警报,非常感谢任何帮助。

function getDetails(ID){
        var qArray = [];
        $.get('get_Question', {"Id":ID}, function(){})
        .success(function(data){
            var json = $.parseJSON(data);
            qArray.push(json.value1);
            qArray.push(json.value2);

        });
        //First Alert
        alert("-> "+qArray[0]);
        return qArray;
     }

这是调用上述方法的第二个警报:

var myArray = getDetails(4);
alert("myArray [0]: "+myArray[0]);

7 个答案:

答案 0 :(得分:9)

您无法返回值,$.get()调用异步

您需要推迟qArray上的任何操作,直到AJAX调用完成,即在回调中。

更好的是,使用延迟回调:

function getDetails(ID) {
    return $.get('get_Question', {"Id":ID})
            .pipe(function(json) {
               return [json.value1, json.value2];
             });
}

.pipe延迟函数创建一个新的promise,它最终将返回所需的数组,但只有在AJAX调用完成后才会返回。

然后你会这样使用:

getDetails(ID).done(function(qArray) {
     alert("-> " + qArray[0]);
});

请注意$.get()不直接支持错误回调,但是对于延迟对象,您可以访问它们:

getDetails(ID).done(function(qArray) {
     alert("-> " + qArray[0]);
}).fail(function(jqXHR, textStatus, errorThrown)) {
     alert("The AJAX request failed:" + errorThrown);
});

如果没有这个,你需要直接在getDetails()函数中构建错误处理,然后需要一些机制来告诉应用程序逻辑的其余部分错误。

NB 我假设您不需要手动调用JSON.parse() - 如果您的Web服务器返回正确的Content-Type标头,则jQuery将执行此操作你自动了。

答案 1 :(得分:4)

Ajax调用以异步方式发生,这意味着您不能等待调用返回并获取值。这样做的方法是使用回调。你的例子将变成类似的东西:

function getDetails(ID, callback){
    $.get('get_Question', {"Id":ID}, function(){})
    .success(function(data){
        var qArray = [];
        var json = $.parseJSON(data);
        qArray.push(json.value1);
        qArray.push(json.value2);
        callback(qArray)
    });
 }

调用它会改变一点:

getDetails(4, function (myArray) {
    alert("myArray [0]: "+myArray[0]);
});

答案 2 :(得分:2)

在ajax调用完成之前调用First Alert,因此该变量仍未定义。 这是因为$ .get()是异步完成的。 $ .get()没有为异步调用传递参数的选项,因此您应该使用$ .ajax()来传递参数async: false

答案 3 :(得分:1)

$.get调用会为相关资源创建新的异步请求。

当您拨打第一个提醒时,它是undefined,因为请求尚未完成。此外,由于您被迫暂停警报,请求有时间在后台完成。第二次警报有足够的时间可以使用它。

当您注释掉第一个警报时,会发生同样的事情。这次在请求完成之前调用第二个警报,值为undefined

您需要发出请求synchronous或在收到响应后考虑继续执行,方法是使用success中已定义的$.get回调函数中的回调函数。

答案 4 :(得分:1)

正如其他几位人士所说,ajax-request是异步。但是,您可以将async属性设置为false以获取同步请求。

示例:

function getDetails(ID) {
   var result = $.ajax('get_Question', { 
      async : false, 
      data : { 'Id' :  ID }
   });

   // do something with the result

   return result;
}

我自己会使用回调函数,而beacuse async:false是不好的做法,也不推荐使用。

答案 5 :(得分:0)

您需要重写$.get才能使用$.ajax并指定async: false

答案 6 :(得分:0)

AJAX是异步的:您无法确定请求何时完成。这通常意味着您需要传递将在请求完成时使用请求结果调用的回调方法。在你的情况下,这看起来像:

function getDetails(ID, callbackFunc){
    $.get('get_Question', {"Id":ID}, function(){})
    .success(function(data){
        var qArray = [];
        var json = $.parseJSON(data);
        qArray.push(json.value1);
        qArray.push(json.value2);
        callbackFunc(qarray);
    });
 }

 getDetails(4, function(qArray) {
     alert("myArray [0]: "+qArray[0]);
 };