【问题标题】:My promises no longer working in jQuery 1.8我的承诺不再适用于 jQuery 1.8
【发布时间】:2012-10-17 14:06:32
【问题描述】:

此代码 sn-p 在 1.7.2 中使用成功/错误回调以及承诺样式回调。在 1.8.2 中,成功/错误回调仍然有效,但 Promise 无效。我的直觉是return dfd.promise(jqXHR); 行是问题,但我不确定。

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {

    // Don't infinitely recurse
    originalOptions._retry = isNaN(originalOptions._retry)
        ? Common.auth.maxExpiredAuthorizationRetries
        : originalOptions._retry - 1;

    // set up to date authorization header with every request
    jqXHR.setRequestHeader("Authorization", Common.auth.getAuthorizationHeader());

    // save the original error callback for later
    if (originalOptions.error)
        originalOptions._error = originalOptions.error;

    // overwrite *current request* error callback
    options.error = $.noop();

    // setup our own deferred object to also support promises that are only invoked
    // once all of the retry attempts have been exhausted
    var dfd = $.Deferred();
    jqXHR.done(dfd.resolve);

    // if the request fails, do something else yet still resolve
    jqXHR.fail(function () {
        var args = Array.prototype.slice.call(arguments);

        if (jqXHR.status === 401 && originalOptions._retry > 0) {

            // refresh the oauth credentials for the next attempt(s)
            // (will be stored and returned by Common.auth.getAuthorizationHeader())
            Common.auth.handleUnauthorized();

            // retry with our modified
            $.ajax(originalOptions).then(dfd.resolve, dfd.reject);

        } else {
            // add our _error callback to our promise object
            if (originalOptions._error)
                dfd.fail(originalOptions._error);
            dfd.rejectWith(jqXHR, args);
        }
    });

    // NOW override the jqXHR's promise functions with our deferred
    return dfd.promise(jqXHR);
});

更新:这是我的 ajax 请求失败:

$.ajax({
        url: someFunctionToGetUrl(),
        // works
        //success: callback,
        //error: ajaxErrorHandler
    }).then(
        [callback],
        [errorback, ajaxErrorHandler]
    );
};

【问题讨论】:

  • 您的请求是否同步?如果是这样,它将不适用于jqXHR。来自文档:“从 jQuery 1.8 开始,不推荐使用 async: false 和 jqXHR ($.Deferred);您必须使用完整/成功/错误回调。”
  • 不,在帖子中添加了我的 ajax 请求
  • 您熟悉 Chrome 调试器吗? >.
  • 我会尽快找到答案

标签: javascript ajax jquery jquery-deferred


【解决方案1】:

编辑:这是一个文档错误,但行为是设计使然。 api 发生了变化,deferred.then 现在的行为类似于deferred.pipe 并且不再允许传入数组,但文档尚未更新以反映这一点。

相关错误:

我在下面原始答案末尾描述的解决方法仍然适用。


原答案:

对我来说,它看起来像是一个 jQuery 错误。如果你传入一个函数引用作为第一个参数,它可以工作,但如果你传入一个函数数组,则不行:

http://jsfiddle.net/tunDH/

但是,the documentation 说函数数组就可以了:

doneCallbacks 一个函数或函数数组,在 Deferred 被解析时调用。

而且,你是对的。它适用于 jQuery 1.7:http://jsfiddle.net/tunDH/1/

一种解决方法是将所有函数调用包装在一个函数中,而不是在一个数组中:

$.ajax({ 
    url: someFunctionToGetUrl(), 
    // works 
    //success: callback, 
    //error: ajaxErrorHandler 
}).then( 
    function(){
        callback1.apply(this, arguments);
        callback2.apply(this, arguments);
    }, 
    [errorback, ajaxErrorHandler] 
); 

http://jsfiddle.net/tunDH/2/

您可能需要对错误回调执行相同的操作,但我没有对此进行测试。

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 2015-04-18
    • 2020-12-06
    • 2019-11-01
    • 2018-01-06
    • 2015-07-26
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多