1

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

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]);
4

7 回答 7

9

您不能返回值,$.get()调用是异步的。

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

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

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

deferred 函数创建了一个新的.pipePromise,它最终将返回所需的数组,但仅在 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()函数中,然后需要一些机制来告诉应用程序逻辑的其余部分有关错误。

注意,我假设您实际上并不需要JSON.parse()手动调用 - 如果您的 Web 服务器返回正确的Content-Type标头,那么 jQuery 会自动为您执行此操作。

于 2013-01-03T11:54:25.943 回答
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]);
});
于 2013-01-03T11:55:18.087 回答
2

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

于 2013-01-03T11:55:44.310 回答
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;
}

我自己会使用回调函数,因为async:false这是不好的做法,也已被弃用。

于 2013-01-03T12:05:35.353 回答
1

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

当您调用第一个警报时,这是undefined因为请求尚未完成。此外,由于您被迫暂停警报,因此请求有时间在后台完成。有足够的时间让它在第二个警报前可用。

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

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

于 2013-01-03T11:57:25.123 回答
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]);
 };
于 2013-01-03T12:00:06.350 回答
0

您需要重写$.get以使用$.ajax和指定async: false

于 2013-01-03T11:54:12.237 回答