2011-05-18 14 views
5

Estoy manteniendo un caché en JavaScript usando jquery en una variable de caché global.Administrar caché sincrónicamente en js

Cada vez que se recibe información nueva mediante AJAX, se agrega a la memoria caché.

Si no está en la caché, quiero AJAX desde el servidor.

que desea implementar una función para consultar sobre la demanda y para usarlo de esta manera:

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

Dónde GetName() debe ser como:

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

QueryUsernameFromServer() debe ser como:

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

sin embargo, $ .ajax es asíncrono significado que no puede esperar a un valor (y por lo tanto no pueden regresar eso).

Usando $ .ajax en el modo de sincronización de alta no es recomendable (se bloquea el navegador y que no es compatible JSONP), http://api.jquery.com/jQuery.ajax/

uso de este, http://www.techfounder.net/2008/05/17/simple-javascript-cache/, enfoque requiere una devolución de llamada. Sin embargo, no se desea crear una devolución de llamada para cada uso.

¿Hay una buena manera de implementar una función de "caché a petición" en js y ajax sin una devolución de llamada dedicada para cada uso?

Respuesta

5

Deberá tener la devolución de llamada, porque AJAX es ... espere ... "A" sincrónico.

Simplemente agregue una devolución de llamada a sus funciones que consultan el caché. Es muy sencillo:

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

y simplemente convertir a un estilo asíncrono en el código:

Antes:

var name = getName('jvenema'); 

Después:

getName('jvenema', function(name){ 

}); 
+0

+1 para una buena solución. esto es _exactamente_ lo que utilicé para nuestro proveedor de datos en el trabajo. Me gusta tener una capa de datos para poder reutilizarla y actualizar todo el código 'ajax' en una ubicación (por ejemplo, cuando jQuery revisó su espacio de nombres' ajax'). – pixelbobby

1

Si su uso de jQuery 1.5 + entonces puedes usar diferidos.

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

Y el uso de la siguiente manera deferreds

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

}); 
Cuestiones relacionadas