2017-11-17 17 views
1

バックエンドに対してx回の呼び出しを行う必要があります。それらの一部は同じURLになります。私は結果をキャッシュしています。しかし、私の問題は、loadCachedを同じURLで2回(または複数回)呼び出すと、最初のフェッチが解決される前にキャッシュにURLがないため、実際にフェッチを2回呼び出すことになります。したがって、キャッシュは1つのフェッチが正常に完了した(=解決された)場合にのみ機能します。重複したクエリを避けるために最初のフェッチが解決されるのを待つようにコードを改善するにはどうすればよいですか?node.jsで同じURLが2回呼び出されるのを防ぐ方法

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

私は、loadCachedが解決するまで待つためにpromise.all()を使用しています。あなたは全体の約束をキャッシュする必要が

+2

結果の代わりに約束をキャッシュする必要があります。 – SLaks

+0

https://runkit.com/moongod101/5a0f1c865f47c000128a96bb私は何かうまくいくと思いますか? –

答えて

1

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

はまた、マップと新しい値を設定するために、あなたはcache[url]が間違っているset方法を、使用する必要があることに注意してください。

+0

'fetch'の結果をキャッシュすることは正しくありません。なぜなら、その本体が使用されると、再度使用することはできないからです。フェッチがブラウザでフェッチと同じであると仮定すると、' loadCached( 'xxx')。 (result => console.log(result)) 'は一度しか動作しません - キャッシュの使用を無効にします:p - 代わりにpromise.then(response => response.clone()。text())'を返すことができます –

+0

ありがとうございました。私はこれを検証し、node.jsの場合にはクローニングも必要です。 –

+0

@dfsqお願いします! https://stackoverflow.com/questions/47369109/phantomjs-does-not-support-audio-tag – ikerya

関連する問題