2017-11-17 3 views
1

Ich habe x Anzahl der Anrufe an Back-End gemacht werden. Einige von ihnen sind zu denselben URLs. Ich speichere die Ergebnisse. Aber mein Problem ist, dass wenn ich loadCached sofort zweimal (oder mehrmals) mit der gleichen URL anrufe, wird es auch zweimal aufrufen, da der Cache keine URL hat, bevor der erste Abruf gelöst wird. Das Caching funktioniert also nur, wenn ein Abruf erfolgreich abgeschlossen wurde (= gelöst). Wie kann ich den Code so verbessern, dass er darauf wartet, dass der erste Abruf aufgelöst wird, um doppelte Abfragen zu vermeiden?Wie zu verhindern Fetch mit der gleichen URL zweimal aufgerufen in node.js

function loadCached(url) { 
    let cache = loadCached.cache || (loadCached.cache = new Map()); 

    if (cache.has(url)) { 
    return Promise.resolve(cache.get(url)); // (*) 
    } 

    return fetch(url) 
    .then(response => response.text()) 
    .then(text => { 
     cache[url] = text; 
     return text; 
    }); 
} 

Ich benutze provect.all() zu warten, bis LoadCached zu lösen.

+2

Sie müssen die Versprechen statt der Ergebnisse zwischenspeichern. – SLaks

+0

https://runkit.com/moongod101/5a0f1c865f47c000128a96bb Ich denke, etwas wird funktionieren? –

Antwort

1

Sie müssen ganze Versprechen zwischenzuspeichern:

function loadCached(url) { 
    let cache = loadCached.cache || (loadCached.cache = new Map()); 
    let promise; 

    if (cache.has(url)) { 
    promise = cache.get(url) 
    } else { 
    promise = fetch(url) 
    cache.set(url, promise) 
    } 

    return promise 
    .then(response => response.text()) 
} 

auch beachten, dass, um neuen Wert mit der Karte zu setzen, müssen Sie set Methode verwenden, ist cache[url] falsch.

+0

Das Zwischenspeichern des Ergebnisses von 'fetch' ist nicht ganz richtig, denn sobald dieser body verwendet wird, können Sie ihn nicht mehr verwenden - vorausgesetzt, fetch funktioniert genauso wie fetch in einem Browser - also,' loadCached ('xxx'). dann (result => console.log (result)) 'wird nur einmal funktionieren - die Verwendung des Caches wird negiert: p - Sie könnten stattdessen' promise.then (response => response.clone(). text()) 'zurückgeben –

+0

Vielen Dank. Ich verifizierte dies funktioniert und auch Klonen ist in node.js Fall benötigt. –

+0

@dfsq BITTE HILFE !!! https://stackoverflow.com/questions/47369109/phantomjs-does-not-support-audio-tag – ikerya

Verwandte Themen