关于javascript:从ajax调用请求返回值的函数

function that return a value from ajax call request

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

我想要一个从ajax请求返回值的函数。 我想停止javascript执行,直到函数获取其值由ajax异步请求返回。
就像是:

1
2
3
4
5
6
7
8
9
10
11
12
function myFunction() {
    var data;
    $.ajax({
        url: 'url',
        data: 'data to send',
        success: function (resp) {
            data = resp;
        },
        error: function () {}
    }); // ajax asynchronus request
    return data; // return data from the ajax request
}


你需要注册一个回调函数,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function test() {
    myFunction(function(d) {
        //processing the data
        console.log(d);
    });
}

function myFunction(callback) {
    var data;
    $.ajax({
        url: 'url',
        data: 'data to send',
        success: function (resp) {
            data = resp;
            callback(data);
        },
        error: function () {}
    }); // ajax asynchronus request
    //the following line wouldn't work, since the function returns immediately
    //return data; // return data from the ajax request
}


Ajax是异步的,这意味着调度了ajax调用,但是你的代码在不停止的情况下继续像以前一样运行。 在收到响应之前,Ajax不会停止/暂停执行。 你必须添加一个额外的回调函数或类似的东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    function myFunction() {
var data;
$.ajax({
    url: 'url',
    data: 'data to send',
    async: false,
    success: function (resp) {
        data = resp;
        callback.call(data);
    },
    error: function () {}
}); // ajax asynchronus request
return data; // return data from the ajax request
  }


你需要做asyn = False,如:

1
2
3
4
5
6
7
$.ajax({
    async: false,
    // ...
    success: function(jsonData) {
    //Your Logic
    }
});


1
2
3
4
5
6
7
8
9
$.ajax({
        url: 'url',
        data: 'data to send',
        async: false,
        success: function (resp) {
            data = resp;
        },
        error: function () {}
    }); // ajax synchronus request


因为Ajax是异步的,所以使用async: false作为你的ajax请求。

将async设置为false意味着您调用的语句必须在函数中的下一个语句被调用之前完成。 如果设置async:true,则该语句将开始执行,并且无论异步语句是否已完成,都将调用下一个语句。

来自jQuery文档:

By default, all requests are sent asynchronously (i.e. this is set to
true by default). If you need synchronous requests, set this option to
false