Va bene usare Promises for Caching

0

È accettabile (non sorprende) utilizzare le promesse per memorizzare i risultati nella cache? L'idea è di generare una promessa una volta, e solo restituire la stessa promessa di nuovo alle chiamate successive.

Ad esempio, una funzione getAll () che restituisce una promessa esegue una funzione che richiede molto tempo solo alla prima chiamata e restituisce la stessa promessa alle chiamate ripetute.

Esempio (in JavaScript, ma in realtà non l'ho provato, quindi più simile a pseudo-codice):

var oldPromise = null;

function getAll() {
    var newPromise;

    if (!oldPromise) {

        // first time called
        newPromise = new Promise(function (resolve, reject) {
            timeIntensiveFunction(function callback(data) {
                resolve(data);
            });
        });

        oldPromise = newPromise

        return newPromise;
    } else {

        // already did it
        return oldPromise;
    }
}
    
posta Harry Pehkonen 12.04.2015 - 17:41
fonte

2 risposte

1

Questo è un uso assolutamente ragionevole delle promesse. È uno dei modi principali che promette sono destinati ad essere utilizzati.

Il modo in cui le promesse possono avere .then () aggiunto prima o dopo essere stato risolto è direttamente per consentire questo tipo di utilizzo. Il punto è che potresti avere subito il valore, altrimenti potrebbe non essere visualizzato fino a qualche tempo dopo. In entrambi i casi, l'API promessa funziona allo stesso modo.

Sul lato, il codice può essere semplificato

var promise = null;

function getAll() {
    if (!promise) {

        // first time called
        promise = new Promise(function (resolve, reject) {
            timeIntensiveFunction(function callback(data) {
                resolve(data);
            });
        });
    }
    return promise;
}

O usando lodash o underscore

getAll = _.memoize(function() {
   return new Promise(function (resolve, reject) {
       timeIntensiveFunction(function callback(data) {
           resolve(data);
       });
   });   
});
    
risposta data 13.04.2015 - 02:56
fonte
-1

Bene, chiamare una funzione intensiva nel flusso asincrono non è accettabile perché blocca tutto finché non ritorna. Questo è il problema fondamentale delle prestazioni con il multi-tasking cooperativo.

In secondo luogo, assicurati di testare i possibili flussi con la tua libreria di promesse effettive. In particolare, verifica cosa succede se la promessa viene restituita due volte, e inizia a funzionare due volte, e cerca di finire due volte. Diverse librerie di promesse possono fare cose diverse in questa situazione. La soluzione sicura è assumere che spetti a te evitare di eseguire due volte la cosa lunga, quindi non tentare di risolverla due volte.

In terzo luogo, lo snippet non mostra da dove provengono i dati. Assicurati di non restituire i risultati del calcolo con un insieme di dati errato!

In quarto luogo, in caso di dubbio, commenta lo scopo di ciò che stai facendo. Non confondere il programmatore di manutenzione!

Questi sono molti avvertimenti. Se sei a tuo agio con loro, allora questa sembra essere una soluzione ragionevole. Personalmente sarei incline a meccanismi di caching più avanzati che rendano evidente ciò che sta accadendo. Ma dovrebbe funzionare.

    
risposta data 12.04.2015 - 18:20
fonte

Leggi altre domande sui tag