【问题标题】:$.when() not waiting for ajax response$.when() 不等待 ajax 响应
【发布时间】:2015-03-03 15:26:57
【问题描述】:

我有一个问题,如果我调用包含 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;
        }
    });
}

【问题讨论】:

  • fun 没有返回任何东西,所以when 正在等待undefined。添加返回语句。
  • 添加返回并不能解决问题,当立即返回 null 而无需等待 ajax 完成。

标签: jquery ajax asynchronous concurrency


【解决方案1】:

你必须返回$.ajax给出的deferred:

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

来自the documentation 解释为什么你的回调被执行:

如果单个参数被传递给 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'
    });
}

【讨论】:

  • 为了迂腐,$.ajax(...) 返回延迟。 $.ajax(...).promise() 将返回一个承诺。
  • @saimiris_devel 您的代码中还有其他错误,请阅读更新后的答案。
  • 这个答案在两个小时的挣扎后救了我。只是在我的延迟方法中错过了“回报”。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2013-10-14
相关资源
最近更新 更多