6
votes

Existe-t-il un modèle commun recommandé pour mémoiser les appels Ajax?

Je travaille avec certaines données du gouvernement publiées via Socrata's Soda API .

Cette API fournit un moyen de récupérer des lignes via un appel de repos. L'API permet un paramétrage limité de la requête - essentiellement, vous pouvez effectuer une recherche de texte complète et rien d'autre. Je ne trouve pas un moyen de définir les données retournées - par exemple, ne renvoyez que certaines colonnes des données. p>

En conséquence, je ne peux que récupérer toutes les lignes et toutes les colonnes de chaque vue de données. C'est bon, je suppose que, mais j'aimerais le mettre en cache - Memoiser em> utiliser le terme de soulignement. P>

Y a-t-il un modèle de mémoisation des appels AJAX avec jQuery? P>


edit strong>: Pour vous donner une idée de ce dont je parle, voici ce que je fais actuellement. P>

function onclick(event) {
    var $t = $(event.currentTarget);
    var itemId = $t.attr('data-itemid');
    var url = getRestUrl(itemId);
    if (typeof datacache[itemId] === "undefined") {
        $.ajax({
            url       : url,
            cache     : true,
            type      : "GET",
            dataType  : "json",
            error     : function(xhr,status,error) {
                raiseError(error);
            },
            success   : function(response, arg2, xhr) {
                datacache[itemId] = response;
                doSomethingWithTheData(url, itemId);
            }});
    }
    else {
        doSomethingWithTheData(url, itemId);
    }
}

// then, doSomethingWithTheData() simply references datacache[itemId]


3 commentaires

On dirait que cela dépendra d'un Lot sur la nature de la source de données.


Pourquoi alors? Supposons que les données revenant sont JSON. Je veux minimiser l'utilisation de XHR et même si vous souhaitez minimiser les résultats de XHR-avec mis en cache. Le motif devrait être assez simple et générique.


Ce que je voulais dire, c'est que cela dépend de la "momoisabilité" des données.


3 Réponses :


3
votes

Vous pourriez être capable de faire quelque chose comme se fait avec des recherches autocompresses (c'est beaucoup de mémoire, mais vous obtiendrez l'idée):

var searchCache = {}, searchXhr = null;

function Search(term) {

    if (term in searchCache) {
        return doSomethingWithTheData(searchCache[term]);
    }

    if (searchXhr != null) {
        searchXhr.abort();
    }

    searchXhr = $.ajax({
        url       : url,
        cache     : true,
        type      : "GET",
        dataType  : "json",
        error     : function(xhr, status, error) {
            raiseError(error);
        },
        success   : function(response, arg2, xhr) {
            searchCache[term] = response;
            if (xhr == searchXhr) {
                doSomethingWithTheData(response);
                searchXhr = null;
            }
        }
    });

}


0 commentaires

0
votes

Je ne suis pas nécessairement le meilleur expert pour la question JavaScript, mais je pourrais peut-être vous aider avec votre utilisation de soda.

Si vous recherchez plus de flexibilité dans vos questions et que vous pouvez effectuer un message HTTP, vous pouvez consulter la syntaxe de la requête pour effectuer une requête plus ciblée: http://dev.socrata.com/Querying-DataSets . Notre syntaxe de requête est relativement complexe, mais je peux vous aider à déterminer comment structurer votre requête si vous frappez des chicots.

Malheureusement, depuis que cela nécessiterait un poste, vous devez sortir de la boîte de verrouillage croisée XHR en passant par un proxy ou quelque chose de similaire.

En outre, FYI, nous travaillons sur une nouvelle syntaxe qui vous permettra de spécifier des requêtes sous forme de paramètres d'URL, afin de pouvoir effectuer des demandes simples telles que / ressources / agences? acronyme = CIA ou / ressources / agences? $ Où = 'budget> 10000000' . Il devrait être assez génial.


2 commentaires

Merci, Chris. Je vais essayer ça. Je cherchais juste cette documentation, mais je ne l'ai pas trouvé. Pas certain de pourquoi. Il n'y aura aucun problème à utiliser Post. J'utilise IIRF et ProXypass pour vous connecter à la DataSource.


Ok, j'ai essayé ça; Cela n'a pas fonctionné comme prévu. Je ne connecte pas réellement à Opendata.socrata.com. Je me connecte à une agence GVVT. La fonction de requête est-elle prise en charge sur tous les points d'extrémité Socrata accessibles au public? J'ai d'autres questions. et commentaires aussi, si vous êtes intéressé. peut-être mieux déconnecté.



0
votes

Vous ne cacheriez que les demandes Ajax que vous savez ne changeront pas, comme le Facebook SDF, par exemple. Cela semble être dans votre exemple, vous demandez quelque chose d'interface utilisateur qui pourrait être inapproprié pour cache? Sinon, vous pouvez essayer quelque chose comme ceci:

var store = {}; xxx


0 commentaires