$ .when()不等待ajax响应

sai*_*vel 3 ajax concurrency jquery asynchronous

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

示例小提琴:ajax null返回值示例

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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 8

您必须退回给定的延期$.ajax:

function fun() {
    return $.ajax({//this ajax call should return an ip
Run Code Online (Sandbox Code Playgroud)

文档中解释执行回调的原因:

如果将单个参数传递给jQuery.when()并且它不是Deferred或Promise,则它将被视为已解决的Deferred,并且所有附加的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'
    });
}
Run Code Online (Sandbox Code Playgroud)