是否可以在AJAX调用中使用条件以避免重复代码?

时间:2015-05-01 09:01:52

标签: javascript jquery ajax http duplication

例如,我正在实现客户端javascript,如果附加参数超过IE对GET HTTP请求的2048个字符的安全限制,将使用POST,而是将参数以JSON格式附加到正文。我的代码类似于以下内容:

var URL = RESOURCE + "?param1=" + param1 + "&param2=" + param2 + "&param3=" + param3();
        if(URL.length>=2048) {
            // Use POST method to avoid IE GET character limit
            URL = RESOURCE;
            var dataToSend = {"param3":param3, "param1":param1, "param2":param2};
            var jsonDataToSend = JSON.stringify(dataToSend);
            $.ajax({
                type: "POST",
                data: jsonDataToSend,
                dataType: 'json',
                url: URL,
                async: true,
                error: function() {
                    alert("POST error");
                },
                success: function(data) {
                    alert("POST success");
                }
            });
        }else{
            // Use GET
            $.ajax({
                type: "GET",
                dataType: 'json',
                url: URL,
                async: true,
                error: function() {
                    alert("GET error");
                },
                success: function(data) {
                    alert("GET success");
                }
            });
        }

我有没有办法避免两次写出这个ajax?像

这样的东西
if(URL.length>=2048) {
// Use POST instead of get, attach data as JSON to body, don't attach the query parameters to the URL
}

N.b。我知道使用POST而不是GET来检索数据违反了REST的某些原则,但由于IE的限制,这是我能够找到的最好的工作。处理这种情况的替代建议也值得赞赏。

1 个答案:

答案 0 :(得分:1)

jQuery的$.ajax方法获取具有属性的对象。所以很容易,生成该对象和“标准设置”并根据某些逻辑修改它们,最后通过ajax调用将其传递给一个loc。

原理:

 var myAjaxSettings = {
            type: "POST",
            data: jsonDataToSend,
            dataType: 'json',
            url: URL,
            async: true,
            error: function() {
                alert("POST error");
            },
            success: function(data) {
                alert("POST success");
            }
        }

  if ( <condition a> )
      myAjaxSettings.type = "GET";

  if ( <condition b> )
      myAjaxSettings.success = function (data) { ...make something different ... };

  $.ajax(myAjaxSettings);