返回AJAX调用数据的JavaScript函数

JavaScript function that returns AJAX call data

本问题已经有最佳答案,请猛点这里访问。

我想创建一个javascript函数,它返回jquery-ajax调用的值。我想要像这样的东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
function checkUserIdExists(userid){
    return $.ajax({
        url: 'theurl',
        type: 'GET',
        cache: false,
        data: {
           userid: userid
        },
        success: function(data){
            return data;
        }
    });
}

我知道我可以通过将async设置为false来实现这一点,但我宁愿不这样做。


您不能返回Ajax调用返回的数据,除非您想同步调用它(而且您不信任我)。但您可以返回的是Ajax调用返回的数据,实际上您可以以非常优雅的方式进行。

(更新:请注意,当前jquery承诺与promises/a+规范不兼容-有关详细信息,请参阅此答案。)

基本上,您可以返回您的$.Ajax(…)调用的返回值:

1
2
3
4
5
6
7
8
9
10
function checkUserIdExists(userid){
    return $.ajax({
        url: 'theurl',
        type: 'GET',
        cache: false,
        data: {
           userid: userid
        }
    });
}

调用函数的人可以这样使用它:

1
2
3
checkUserIdExists(userid).success(function (data) {
    // do something with data
});

如果您感兴趣的话,请参阅我的这篇文章以获得更好的解释和演示。


可以传入回调函数:

1
2
3
4
5
6
7
8
9
10
function checkUserIdExists(userid, callback) {
    $.ajax({
        ...
        success: callback
    });
}

checkUserIdExists(4, function(data) {

});


从jquery 1.8开始,"success"、"error"和"complete"回调被弃用。相反,您应该使用"完成"、"失败"和"始终"。

所以你可以:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function checkUserIdExists(userid, callback) {
        return $.ajax({
        url: 'theurl',
        type: 'GET',
        cache: false,
        data: {
           userid: userid
        }
    })
    .done(callback)
    .fail(function(jqXHR, textStatus, errorThrown) {
        // Handle error
    });
}

checkUserIdExists(2, function(data) {
    console.log(data); // Do what you want with the data returned
});

使用jquery 1.5,您可以使用全新的$.Deferred功能,这正是为了实现这一点。

1
2
3
4
5
6
7
8
9
10
11
// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax({ url:"example.php" })
    .success(function() { alert("success"); })
    .error(function() { alert("error"); })
    .complete(function() { alert("complete"); });

// perform other work here ...

// Set another completion function for the request above
jqxhr.complete(function(){ alert("second complete"); });

来源


这不是Javascript异步编程真正要做的事情。相反,在success函数中使用回调来调用另一个函数来使用从服务器返回的数据。


蒂姆,这两种情况是互斥的;异步操作既不能用于任何目的,也不能检索返回的数据。

您应该为Ajax调用查看一个支持事件的基础结构。