6 Stimmen

Gibt es ein empfohlenes allgemeines Muster, um Ajax-Aufrufe zu memoisieren?

Ich arbeite mit einigen Regierungsdaten, die über Sokratas SODA api .

Diese API bietet eine Möglichkeit, Zeilen über einen REST-Aufruf abzurufen. Die API ermöglicht eine begrenzte Parametrisierung der Abfrage - im Grunde können Sie eine Volltextsuche durchführen und sonst nichts. Ich kann keine Möglichkeit finden, die zurückgegebenen Daten zu gestalten - zum Beispiel nur bestimmte Spalten der Daten zurückzugeben.

Infolgedessen kann ich im Grunde nur alle Zeilen und alle Spalten jeder Datenansicht abrufen. Das ist in Ordnung, denke ich, aber ich möchte sie zwischenspeichern. es auswendig lernen um den Begriff "Unterstrich" zu verwenden.

Gibt es ein Muster für die Memoisierung von Ajax-Aufrufen mit jQuery?


EDITAR : Damit Sie sich ein Bild davon machen können, wovon ich spreche, stelle ich Ihnen hier vor, was ich derzeit mache.

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]

Diese scheint als ob es schneller ginge, obwohl ich es nicht gemessen habe. Was ich wirklich wissen möchte, ist, Gibt es ein allgemeines Muster, das so etwas tut, das ich verwenden kann, so dass jeder, der den Code liest, sofort sieht, was ich tue?

3voto

Cᴏʀʏ Punkte 101076

Möglicherweise können Sie etwas Ähnliches tun wie bei der automatischen Vervollständigung von Suchanfragen (dies ist zwar nur aus dem Gedächtnis, aber Sie werden die Idee verstehen):

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

}

0voto

chrismetcalf Punkte 1571

Ich bin nicht unbedingt der beste Experte für Javascript Fragen, aber ich könnte in der Lage sein, Ihnen mit Ihrer Verwendung von SODA zu helfen.

Wenn Sie Ihre Abfragen flexibler gestalten möchten und einen HTTP POST durchführen können, können Sie unsere Abfragesyntax verwenden, um eine gezieltere Abfrage durchzuführen: http://dev.socrata.com/querying-datasets . Unsere Abfragesyntax ist ziemlich komplex, aber ich kann Ihnen helfen, herauszufinden, wie Sie Ihre Abfrage strukturieren müssen, falls Sie auf Schwierigkeiten stoßen.

Da dafür ein POST erforderlich ist, müssen Sie leider die XHR-Sperre für domänenübergreifende Verbindungen umgehen, indem Sie einen Proxy oder etwas Ähnliches verwenden.

Außerdem arbeiten wir an einer ganz neuen Syntax, die es Ihnen ermöglicht, Abfragen als URL-Parameter zu spezifizieren, so dass Sie in der Lage sein werden, einfache Anfragen wie /resources/agencies?acronym=CIA o /resources/agencies?$where='budget > 10000000' . Es sollte ziemlich fantastisch sein.

0voto

Elise Chant Punkte 4839

Sie würden nur Ajax-Anfragen zwischenspeichern, von denen Sie wissen, dass sie sich nicht ändern werden, wie zum Beispiel das Facebook-SDF. In Ihrem Beispiel scheinen Sie etwas anzufordern, das mit der Benutzeroberfläche zu tun hat und für den Cache nicht geeignet ist. Andernfalls könnten Sie etwas in der Art versuchen:

var store = {};

/**
 * Memoized $.getScript
 *
 * Cache one script response per url
 * Reference, see http://msdn.microsoft.com/en-us/magazine/gg723713.aspx
 *
 * @example $.memoizedGetScript( url ).then( successCallback, errorCallback );
 * @param {String} url
 * @param {Function} callback (optional)
 * @returns {*}
 */
$.memoizedGetScript = function(url, callback) {
    var callback = callback || {};

    store.cachedScripts = {};

    if (!store.cachedScripts[url]) {
        store.cachedScripts[url] = $.Deferred(function(d) {
            $.getScript(url).then(
                d.resolve(),
                d.reject()
            );
        }).promise();
    }

    return store.cachedScripts[url].done(callback);
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X