2009-04-22 46 views
4

我有很多JavaScript/jQuery代码块来处理我的页面中的异步 数据处理。每个代码块具有三个功能(代码是不完整的,仅用于说明的目的):重构许多jQuery Ajax调用 - 最佳实践?

  1. 封装$.ajax呼叫:

    function doSomething(data){ 
    
        // do some preprocessing 
    
        $.ajax({}); // some JQuery Ajax operation that accepts data 
    
        // do some postprocessing 
        return false; 
    }
  2. 处理响应:

    function handleResponse(result){ 
        // process the result 
        return false; 
    }
  3. 处理任何错误:

    function handleError(XMLHttpRequest, textStatus, errorThrown){ 
        // gracefully handle the Error and present relevant information to user 
        return false; 
    }

在需要大量的数据处理我最终这些块,这似乎是重复的很多 的页面,所以我决定做一些 重构。

我认为会有不同的方式去解决这个问题。

  1. 可以有一个错误处理程序可以跨Ajax调用重用(显而易见)。
  2. 人们可能可能会重用一些响应处理程序,但这会很不方便,因为响应根据呼叫而有很大不同。
  3. 也许会创建一些提供基本功能的原型对象,并有一个用于错误处理的静态方法(这可以在JavaScript中完成吗?)。

我只是想知道是否有人遇到过这个和/或如果有最佳实践解决方案吗?

+0

这将是有益的,看看一些代码。 – 2009-04-22 11:43:22

回答

7

您可以使用jQuery中的$ .ajaxSetup({})方法来设置一些常用的ajax设置。例如,如果您要在某个页面上一次又一次地发布相同的URL,则只需在ajaxSetup中设置即可。这意味着你将不得不传递更少的参数给理查德提供的函数。 ajax方法的第一个参数的任何属性都可以在$ .ajaxSetup()中设置为默认值。

$.ajaxSetup({ 
    url: 'my/ajax/url' 
    success: function() { 
     // Do some default stuff on success 
    }, 
    error: function() { 
     // Do some default stuff on a failure 
    } 
    // etc... 
}); 

它们可以在任何ajax调用中覆盖。所以,现在你可以这样做:

$.ajax({data:{foo:'bar',bar:'foo'}}); 

你可以重写URL,比如像这样:

$.ajax({url:'different/ajax/url',data:{foo:'bar',bar:'foo'}}); 
7

我们经常使用的包装功能的Ajax调用,以简化使用,所以你可以这样做:

function NewAjax(url, data, success) 
{ 
    $.ajax({ 
     url: url, 
     data: data, 
     success: success, 
     fail: function() 
     { 
     // Do generic failure handling here 
     } 
} 

但我经常偏向于结合使用jQuery AJAX事件每个Ajax事件:

http://docs.jquery.com/Ajax

所以你可以绑定到每一次失败或每Ajax调用如成功:

ajaxError(电话返回) ajax成功(回调)

+0

谢谢你会投票,但我没有声望! :) – 2009-04-22 12:18:16

+1

非常感谢!为了公平起见,我认为KyleFarris拥有最优雅的解决方案,所以我给了他答案:)。 – 2009-04-22 13:30:53

0

正如理查德所示,看看代码片段之间有什么不同,并将它们作为参数传递给函数。 Javascript可以传递函数作为参数,这可以摆脱大量的冗余。

如果url不会改变,那么为什么将它作为参数传递,你可以有一个全局变量,它将具有url的主要部分,并且只传入改变的url部分。

+0

感谢您的澄清 – 2009-04-22 13:33:14