$ .when()不等待ajax响应

时间:2015-03-03 15:26:57

标签: jquery ajax asynchronous concurrency

我遇到一个问题,如果我调用包含Ajax调用的函数并返回这些调用的结果,调用者总是会在Ajax调用返回之前收到空返回值。

示例小提琴:ajax null return value example

var returnVal;

$.when(fun()).done(function(a1)
{
   console.log("finished ajax");
   returnVal = a1;
});

alert(returnVal);

function fun() {
    $.ajax({//this ajax call should return an ip
        url: 'http://ip.jsontest.com/',
        data: "",
        dataType: 'json',
        success: function (data) {
            console.log("fun(id) ajax success");
            return data;
        }
    });
}

1 个答案:

答案 0 :(得分:8)

您必须返回$.ajax给出的延期:

function fun() {
    return $.ajax({//this ajax call should return an ip

the documentation解释执行回调的原因:

  

如果将单个参数传递给jQuery.when()并且它不是   延期或承诺,它将被视为已解决的延期和   附加的任何doneCallbacks将立即执行

您的代码中还有另一个问题:您在异步调用完成之前会发出警报。您应该在回调中移动alert

并且没有理由拥有成功功能,您可以在done回调中处理结果。

你不能真正alert一个对象并获得有意义的东西。您应该alert(JSON.stringify(returnVal))或使用console.log(不要太痛苦,点击F12来显示控制台)。

$.when(fun()).done(function(a1){
    console.log("finished ajax");
    var returnVal = a1;
    console.log(returnVal);
});


function fun() {
    return $.ajax({//this ajax call should return an ip
        url: 'http://ip.jsontest.com/',
        data: "",
        dataType: 'json'
    });
}