jQuery ajax函数未定义结果

时间:2014-05-28 19:22:41

标签: javascript jquery ajax

我意识到这个问题很多,通常答案是AJAX是异步的,这就是为什么它返回undefined,但即使我在这里将异步设置为false,它仍然返回undefined当函数被调用时。 res始终未定义

function sendRequest(link, type, query) {
    $(document).ready(function(){
        $.ajax({
            'url' : link,
            'type' : type,
            'data' : query,
            'async' : false,
            'dataType': "json",
            'headers': {
                'Cache-Control':'max-age=0',
                'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                'Content-Type':'application/x-www-form-urlencoded',
                'Accept-Language':'en-US,en;q=0.8,ar;q=0.6',
            }, 
            'success': function(data) {
                var res = data;
            }
        });
    });
    return res;
} 

此外,我确信请求正确发送,并且响应也正确接收

5 个答案:

答案 0 :(得分:2)

您必须单独声明和分配res

var res;

$.ajax({
    // ...
    'success': function (data) {
        res = data;
    }
});

return res;

目前,res仅在success回调中被声明为局部变量。因此,sendRequest()的剩余部分无法访问它。


但是,您应该尽量避免在Ajax上使用async: false

您可以return Deferred$.ajax()提供的function sendRequest(link, type, query) { return $.ajax({ // ... }); } sendRequest(...).done(function (data) { // ... }); jqXHR,允许调用函数添加自己的处理程序。

{{1}}

" How to return the response from an AJAX call?"

中描述了更多详细信息和选项

答案 1 :(得分:2)

我认为更好的方法是让sendRequest函数返回jQuery Promise Object。作为一个例子

function sendRequest(link, type, query) {
  return $.ajax({
        'url' : link,
        'type' : type,
        'data' : query,
        'dataType': "json",
        'headers': {
            'Cache-Control':'max-age=0',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Content-Type':'application/x-www-form-urlencoded',
            'Accept-Language':'en-US,en;q=0.8,ar;q=0.6',
        }
    });
}

使用

sendRequest('/someurl', 'GET', {}).done(function(data) {
  // do whatever you need with data here
});

答案 2 :(得分:0)

首先 res应该在ajax范围之外,并且其次函数将在ajax调用完成之前返回,这就是未定义的原因:

 $(document).ready(function(){
        $.ajax({
            'url' : link,
            'type' : type,
            'data' : query,
            'async' : false,
            'dataType': "json",
            'headers': {
                'Cache-Control':'max-age=0',
                'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                'Content-Type':'application/x-www-form-urlencoded',
                'Accept-Language':'en-US,en;q=0.8,ar;q=0.6',
            }, 
            'success': function(data) {
                MyFunction(data);
            }
        });


function MyFunction(data)
{

// do with ajax resonse what is needed
}

答案 3 :(得分:0)

这是一个范围问题。 您需要在返回可访问的作用域中声明var res;,并且只需在AJAX中更新该对象。

function sendRequest(link, type, query) {
    var res;
    $(document).ready(function(){
        $.ajax({
            //...
            'success': function(data) {
                res = data;
            }
        });
    });
    return res;
} 

答案 4 :(得分:0)

AJAX是异步的(至少它应该是,我会避免使用async设置为false),因此结果将是未定义的。使用回调:

function sendRequest(link, type, query, callback) {
    $.ajax({
       ..
       ..
       'success': function(data) {
            callback(data);
        }
    });
}

sendRequest(link, type, query, function(data) {
    console.log(data); //YOUR DATA
});