Управление кешем синхронно в js - PullRequest
5 голосов
/ 18 мая 2011

Я поддерживаю кэш в JavaScript, используя jquery в глобальной переменной кэша.

При получении новой информации с использованием AJAX она добавляется в кэш.

Если его нет в кеше, я хочу AJAX с сервера.

Я хочу реализовать функцию для запроса по требованию и использовать ее так:

$("#label").html(GetName("user123"));

Где GetName () должен быть похож на:

function GetName(username) {
    if (Cache[username] != null) return Cache[username];
  else
    return QueryUsernameFromServer(username)
}

QueryUsernameFromServer () должно иметь вид:

function QueryUsernameFromServer (username) {
    return $.ajax(…);
}

Однако $ .ajax является асинхронным, что означает, что он не может ожидать значение (и, следовательно, не может его вернуть).

Настоятельно не рекомендуется использовать $ .ajax в режиме синхронизации (браузер зависает и не поддерживает JSONP), http://api.jquery.com/jQuery.ajax/

При использовании этого подхода http://www.techfounder.net/2008/05/17/simple-javascript-cache/, требуется обратный вызов. Однако создание обратного вызова для каждого использования нежелательно.

Есть ли хороший способ реализовать функцию «кэширования по требованию» в js и ajax без выделенного обратного вызова для каждого использования?

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

Вам потребуется обратный вызов, потому что AJAX ... ждет его ... Синхронный "A".

Просто добавьте обратный вызов в ваши функции, которые запрашивают кэш.Все довольно просто:

function getName(username, callback){
  if(cache[username]){ 
     // cache hit, immediately invoke the callback
     callback(cache[username]); 
  }else{ 
    // assumes this query function updates the cache and invokes the
    // 2nd parameter when it completes
    queryUsernameFromServer(username, function(){
      // invoke the callback now
      callback(cache[username]);
    }); 
  }
}

И просто преобразуйте в свой код асинхронный стиль:

До:

var name = getName('jvenema');

После:

getName('jvenema', function(name){

});
1 голос
/ 18 мая 2011

Если вы используете jQuery 1.5+, вы можете просто использовать deferreds.

function GetName(username) {
    if (Cache[username] != null) return $.when(Cache[username]);
  else
    return QueryUsernameFromServer(username)
}

И использовать deferreds следующим образом

GetName('jvenema').done(function(name) {

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...