Хороший способ избежать второго вызова AJAX - PullRequest
0 голосов
/ 14 июня 2011

Таким образом, я выполняю ajax-вызов в этой функции, примерно так:

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

То, что я делаю в другой функции, делает второй вызов вроде этого:

Так что я действительно хотел бы не делать этот второй звонок.Есть ли хороший способ избежать этого?Может быть, сделать цепочку или что-то подобное, повторно используя обратный вызов из первого?Я слышал, что делать несколько звонков - плохая практика.С уважением

Хотел бы поблагодарить всех, кто ответил.В итоге не использовал ни одно из решений, я решил это по-другому.Я уверен, что большинство приведенных вами примеров были действительно хорошими.Не знаю, как поступить с принятием ответов.Принять все или нет ?!Спасибо!

Ответы [ 5 ]

2 голосов
/ 14 июня 2011

Вы можете создать простое хранилище данных:

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 голос
/ 14 июня 2011

Я обычно использую шаблон модуля кэширования для таких вещей:

// 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);
});

В зависимости от сложности, которую вы хотите поддерживать, вы можете добавить дополнительные функции, такие как истечение срока действия кэша через определенный интервал, кэширование нескольких вызовов (потенциально связанных с URL-адресом AJAX) и т. Д. Мне нравится сохранять API простым и не ссылаться на него. URL-адреса AJAX - таким образом, ваш кеш действует как абстрагированный уровень обслуживания, и вы можете создать другую реализацию кеша для работы с различными источниками данных - полезную для таких вещей, как удаление данных до того, как вы реализовали свои обработчики AJAX на стороне сервера.

1 голос
/ 14 июня 2011

Этого можно добиться, обрабатывая ваши запросы Ajax с использованием какого-либо кеша.Я использую кеш, который сохраняет полученную информацию на основе URL, который он вызвал.Если другая функция отправляет тот же запрос, кэш возвращает извлеченные данные.

Вам также нужно сделать то же самое, проверить, устарели ли данные, чтобы при необходимости их можно было восстановить.

1 голос
/ 14 июня 2011

А как насчет магазинов в скрытом поле? И чем проверить это поле перед отправкой запроса.

1 голос
/ 14 июня 2011

Ну, вы можете просто отправить указатель на функцию, которая выполняет $ .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);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...