【问题标题】:Deferred jQuery AJAX request does not run done() callback function延迟的 jQuery AJAX 请求不运行 done() 回调函数
【发布时间】:2015-05-08 21:03:42
【问题描述】:

我已经设置了一个简单的演示,使用带有 AJAX 请求的 jQuery Deferred 对象来模拟我的应用程序是如何做的。

我的问题是,自从我从旧的非延迟方法切换后,我无法获得成功回调。

仅调用 fail() 回调。有人可以帮我成功回调吗?我看不出哪里出错了?感谢任何帮助

我的演示在这里http://jsfiddle.net/jasondavis/y645yp4g/4/

我以前的 AJAX 调用是这样的......

var ajax = $.ajax({
    type: 'POST',
    async: false,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    url: '/gettask',
    data: {
        action: 'load-task-record',
        task_id: taskId
    },
    success: function(data) {
        // my success functionality here
    }
});

使用延迟对象的新 AJAX 调用...

// Call function that execute AJAX request and returns it
var ajaxRequest = ajaxLoadTaskData();

ajaxRequest.done(function(response) {

    if( response.success ) {
        alert('AJAX request success');
    }else{
        // output the contents of response.errors
    }

}).fail(function(response) {
    // AJAX request failed
    console.log('response', response);
    alert('AJAX request failed');

}).always(function(response) {

});


// Run AJAX request and return Promise()
function ajaxLoadTaskData() {
    return $.ajax({
        type: 'POST',
        async: false,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        url: '/gettask',
        data: {
            action: 'load-task-record',
            task_id: '1',
        },
    });
}

模拟对 /gettask 的 AJAX 请求的 AJAX 响应

// Mock AJAX response for AJAX request to /gettask
$.mockjax({
    url: '/gettask',
    contentType: 'text/json',
    responseTime: 100,
    response: function(settings) {
        console.log('mockJax GET to /gettask :');
        //console.log(settings);
        if (settings.data.value == 'err') {
            this.status = 500;
            this.responseText = 'Validation error!';
        } else {
            var taskrecord = { 'name1': 'bar' };
            this.responseText = taskrecord;
        }
    },
});

【问题讨论】:

  • "从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false ;您必须使用成功/错误/完成回调选项而不是相应的方法jqXHR 对象,例如 jqXHR.done() 或已弃用的 jqXHR.success()。"
  • 另外,contentType: 'application/json; charset=utf-8', 与您发送的数据不匹配:data: { action: 'load-task-record', task_id: taskId }。如果你想发送 JSON 到服务器,你应该发送 json,而不是一个将被转换为表单参数的对象。
  • @KevinB 谢谢!我使用async: false 来解决我之前遇到的问题,方法是不使用 Deferred。所以我最后决定把它换掉,但忘了改变那部分。非常感谢
  • jsfiddle.net/jasondavis/y645yp4g/9 我已经更新了 jQuery 并更改了 async: true。任何其他想法为什么它仍然会fail()
  • 由于 404 atm 而失败。猜测 mockjax 不起作用。

标签: javascript jquery ajax jquery-deferred mockjax


【解决方案1】:

/gettask 在那个 jsFiddle 环境中不存在。使用 console.log(settings) 查看响应的全部内容。您将看到 status 为 404。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2013-04-26
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多