Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
延迟jqueryajax包装器_Jquery_Ajax_Deferred - Fatal编程技术网

延迟jqueryajax包装器

延迟jqueryajax包装器,jquery,ajax,deferred,Jquery,Ajax,Deferred,我正在为jQueryAjax方法创建一个包装器,因为我的AJAX请求在实际进行之前依赖于异步工作 我目前正在做的是: 它有一个返回承诺的外部延迟。我启动doAsyncWork()并等待它完成,然后再实际执行AJAX请求。现在,虽然这样做有效,但问题是当其他脚本因为无法访问jQuery XHR对象的属性而使用包装器时 有没有办法优雅地解决这个问题呢?问题是:他们为什么要这样做?您是否尝试用包装器透明地替换$.ajax()?这将很快变得复杂,因为您将不得不考虑./P>的所有属性和方法。 从理论上讲,

我正在为jQueryAjax方法创建一个包装器,因为我的AJAX请求在实际进行之前依赖于异步工作

我目前正在做的是:

它有一个返回承诺的外部延迟。我启动doAsyncWork()并等待它完成,然后再实际执行AJAX请求。现在,虽然这样做有效,但问题是当其他脚本因为无法访问jQuery XHR对象的属性而使用包装器时


有没有办法优雅地解决这个问题呢?

问题是:他们为什么要这样做?您是否尝试用包装器透明地替换
$.ajax()
?这将很快变得复杂,因为您将不得不考虑./P>的所有属性和方法。 从理论上讲,这样做是可能的,但我不会称之为优雅,也不推荐它:

var ajax = function (options) {
    var deferred = $.Deferred();
    var promise = deferred.promise();

    doAsyncWork()
    .done(function (attributes) {
        $.ajax(options)
        .done(function () {
            promise.readyState = 4
            deferred.resolve.apply(this, arguments);
        })
        .fail(function () {
            promise.readyState = 4
            deferred.reject.apply(this, arguments);
        });
    })
    .fail(function () {
        deferred.reject();
    });

    promise.readyState = 0;
    return promise;
};
其他readystate设置应该转到相应的回调(JQuery中没有
onreadystatechange

那么,该怎么办呢?

如果其他脚本想要使用您的包装器,它们将不得不使用延迟API。如果出于某种原因,他们确实需要访问
jqXHR
对象,您可以这样提供它:

var ajax = function (options, xhrReadyCallback) {
    var deferred = $.Deferred();

    doAsyncWork()
    .done(function (attributes) {
        var xhr = $.ajax(options)
        .done(function () {
            deferred.resolve.apply(this, arguments);
        })
        .fail(function () {
            deferred.reject.apply(this, arguments);
        });
        xhrReadyCallback(xhr);
    })
    .fail(function () {
        deferred.reject();
    });

    return deferred.promise();
};
用法:

ajax(options, function(xhr) {
    // now available:
    xhr.readyState;
});

无法直接传递jqXHR对象,因为它不是在函数返回时创建的


但是-不要忘记jqXHR在
done
fail
回调中都可用,分别作为第三个和第一个参数。

传递
函数(){deferred.resolve.apply(this,arguments);}
与传递
deferred.resolve本身是一样的,但是后者不需要额外的闭包。这是一个很好的解决方案!谢谢。
ajax(options, function(xhr) {
    // now available:
    xhr.readyState;
});