取消链接调用,触发错误链

我正在创建一个用于连接我的服务器方法的ajax实用程序。 我想利用从jQuery.ajax()调用返回的对象中的jQuery 1.5+延迟方法。 情况如下。

  • 服务器端方法总是返回一个JSON对象:

    { success: true|false, data: ... }

  • 客户端实用程序像这样启动ajax调用

    var jqxhr = $.ajax({ ... });

  • 问题领域:

    jqxhr.success(function(data, textStatus, xhr) {
         if(!data || !data.success) { 
             ???? // abort processing, trigger error
         }
    });
    return jqxhr; // return to caller so he can attach his own handlers
    
  • 所以问题是如何取消调用所有的调用者追加成功回调触发他的错误处理程序在所提到的地方????

    该文档说延迟函数调用列表是FIFO,所以我的成功处理程序绝对是第一个。


    更新:请注意,目前jQuery Promises与Promises / A +规范不兼容 - 此答案中的更多信息。)

    在您创建AJAX请求的函数中,您还可以创建延迟对象,并在将其解析和拒绝函数绑定到具有一些自定义数据验证的$ .ajax请求的相应回调之后,向调用方返回一个承诺,如下所示:

    function makerequest() {
    
        var deferred = $.Deferred();
        var promise = deferred.promise();
    
        var jqxhr = $.ajax({
            // ...
        });
    
        jqxhr.success(function(data, status, xhr) {
            if (!data || !data.success) {
                deferred.reject(jqxhr, 'error');
            } else {
                deferred.resolve(data, status, xhr);
            }
        });
    
        jqxhr.error(function(jqXHR, status, error) {
            deferred.reject(jqXHR, status, error);
        });
    
        return promise;
    }
    

    现在任何人都可以使用它,就像这样对你的函数的任何承诺:

    var request = makerequest();
    
    request.done(successCallback);
    request.fail(errorCallback);
    

    甚至只是:

    makerequest().then(successCallback, errorCallback);
    

    如果你还添加这个:

        promise.success = promise.done;
        promise.error = promise.fail;
    

    那么你的调用者将会拥有(或许更熟悉的).success()和.error()接口,就像纯粹的$ .ajax()调用一样:

    var request = makerequest();
    
    request.success(successCallback);
    request.error(errorCallback);
    

    (.complete()的实现仅供读者参考。)

    看到这个演示:

  • http://jsfiddle.net/_rsp/r2YnM/
  • http://jsfiddle.net/_rsp/r2YnM/1/(更详细)
  • 这是另一个直接从工作项目中拉出的例子:

    function ajax(url, data) {
        var self = this;
        var deferred = $.Deferred();
        var promise = deferred.promise();
    
        var jqxhr = $.ajax({
            url: url,
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            type: 'POST'
        }).done(function (msg, status, xhr) {
            if (!msg || msg.Error) {
                self.doError(msg.Error);
                deferred.reject(jqxhr, 'error');
            } else {
                deferred.resolve(msg, status, xhr);
            }
        });
    
        return promise;
    }
    
    链接地址: http://www.djcxy.com/p/55343.html

    上一篇: cancel chained calls, trigger error chain

    下一篇: Make XMLHttpRequest synchronous when "async" option is true?