【问题标题】:JQuery. $.post request .done() .fail() avoid code duplication查询。 $.post request .done() .fail() 避免代码重复
【发布时间】:2012-12-20 09:51:10
【问题描述】:

我有一个类似的发帖请求

  $.post("test", {
    ajax: "true",
    action: ""
  }).done(function(data){
    if (data == "ok"){
        //xxx
    } else if (data == "err"){
        //yyy
    }
  }).fail(function(){
    //yyy
  });

如果 .done() 方法中的代码(注释 'yyy')与失败方法中的代码相同(注释 'yyy'),如何避免发布请求中的代码重复??

【问题讨论】:

  • 如果服务器是你的,为什么不在错误时发送不同的 HTTP 标头?

标签: javascript jquery-ui jquery jquery-plugins


【解决方案1】:

最明显和最简单的解决方案是像这样简单地进行失败回调:

function ajaxFailed() {
    // yyy
}

$.post("test", {
    ajax: "true",
    action: ""
}).done(function(data){
    if (data == "ok"){
        //xxx
    } else if (data == "err"){
        ajaxFailed();
    }
}).fail(ajaxFailed);

【讨论】:

    【解决方案2】:

    您可以使用always 回调方法,请求将始终进入该块。如您所知,何时数据包含错误而不包含错误,此方法适用于服务器端错误。您可以通过定义最后的 else 块来捕获客户端错误。

    $.post("test", {
        ajax: "true",
        action: ""
    }).always(function(data){
        if (data == "ok"){
            //xxx
        } else if (data == "err"){
            //handle server-side errors
        } else {
            //handle client-side errors like 404 errors
        }
    });
    

    【讨论】:

    • 我认为当请求失败时你不会得到data=="err"
    • 我很确定data=="err" 用于请求在服务器端失败时,而不是在客户端。就像@JanDvorak 所说的那样。
    • 你是对的。 data == 'err' 将适用于服务器端错误。我添加了最后一个 else 块来捕获客户端错误。
    【解决方案3】:

    让他们调用相同的函数,例如

    function onErr() { 
        //yyy
    }
    $.post("test", {
        ajax: "true",
        action: ""
    }).done(function(data){
        if (data == "ok"){
            //xxx
        } else if (data == "err"){
            onErr();
        }
    }).fail(onErr);
    

    【讨论】:

    • 谢谢,但我正在寻找一个稍微不同的解决方案。如果我有几个 post 请求怎么办,错误处理会有点不同。我不想为每个错误处理创建一个新函数。
    • @ИгорьСлипко 你必须创建一个新函数,不管是否命名。 -- PS:请更改您的名字,以我键盘上的东西开头。否则很难通知您。
    【解决方案4】:

    另一种方法是稍微更改协议,并使用HTTP status codes 来指示成功或失败:

    if($sqlError){
      header("HTTP/1.1 503 Service unavailable");
    }
    

    ...

    .done(function(){
       //xxx
    }).fail(function(){
       //yyy
    });
    

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多