避免第二次ajax通话的好方法

时间:2011-06-13 21:11:26

标签: javascript jquery ajax get

所以我在这个函数中做了一个ajax调用,有点像这样:

function getCount() {
  $.get("/People/getCount", function (data) {
    if (data && data != "") { 
      // lots of code in here
      }

我在另一个函数中正在做的是第二次调用:

function worldPeople() {
    return $.get("/People/getCount", function (data) {
     if (data != 0) {
        var target = $("#worldNumbers").find("span");
        target.html(data.length).digits();

     }
  })
}

所以我真的想避免再打第二次电话。有什么好方法可以避免这种情况吗?也许做一些链接等,重用第一个回调?我听说做几次电话是不好的做法。 此致

感谢所有回答的人。最后没有使用任何解决方案,我以另一种方式解决了它。我相信你给我的大部分例子都非常好。不知道如何接受答案。全部或全部接受?!谢谢!

5 个答案:

答案 0 :(得分:2)

您可以创建一个简单的数据存储:

App.store = function () {
    this.people = null;
    this.count
    loadPeople = function () {
         if(this.people === null) {
          $.get("/People/getCount", function (data) {
          if (data != 0) {
               this.count = (data.length).digits();
               this.people = data;
           }
         }
    };
} 

答案 1 :(得分:1)

好吧,你可以将函数指针发送到执行$ .get

的函数

基本上你会这样做:

function worldPeople() {
    getCountFromServer(function(data){
        //do sth with data
    });
}

function getCount() {
    getCountFromServer(function(data){
          //do sth with data
    });
}

function getCountFromServer(callback) {
    return $.get("/People/getCount", function (data) {
        if (data)
            callback(data);
    });
}

答案 2 :(得分:1)

隐藏地区的人们的商店数量怎么样?而不是在发送请求之前检查此字段。

答案 3 :(得分:1)

您可以通过使用某种缓存处理Ajax请求来实现此目的。我使用缓存来保存根据它调用的url检索的信息。如果另一个函数设置了相同的请求,则缓存将返回alraedy获取的数据。

您需要做的是检查数据是否已过时,以便在必要时重新提取。

答案 4 :(得分:1)

我通常使用缓存模块模式来处理这类事情:

// create a quick singleton to store cached data
var People = (function() {
    // private variable to act as cache
    var count;

    // function to get cached data
    // note: You have to assume it's always asynchronous
    function getCount(callback) {
        // have we loaded the data yet?
        if (count===undefined) {
            // cache miss: load the data, store it, do the callback
            $.get("/People/getCount", function (data) {
                count = data;
                callback(data);
            }
        } else {
            // cache hit - no need to reload
            callback(count);
        }
    }

    // provide access to the getter function
    return {
        getCount: getCount
    };

}());

第一次点击缓存时,它会从服务器加载;第二次从私有变量加载。

// will load the data asynchronously
People.getCount(function(count) {
    alert("First hit: " + count);
});

// will use the cached data
People.getCount(function(count) {
    alert("Second hit: " + count);
});

根据您希望支持的复杂性,您可以添加其他功能,例如在特定时间间隔后使缓存过期,缓存多个调用(可能键入AJAX URL)等。我希望保持API简单而不是引用AJAX URL - 这样你的缓存就像一个抽象的服务层,你可以创建其他缓存实现来处理不同的数据源 - 对于在你实现服务器端AJAX处理程序之前删除数据之类的东西很有用。 p>