2017-11-17 18 views
1

백엔드에 x 번의 전화를 걸 수 있습니다. 그들 중 일부는 동일한 URL에 있습니다. 결과를 캐싱하고 있습니다. 하지만 내 문제는 바로 loadCached를 동일한 URL로 두 번 (또는 여러 번) 호출하면 실제로 첫 번째 가져 오기가 해결되기 전에 캐시에 URL이 없기 때문에 실제로 두 번 가져 오기를 호출한다는 것입니다. 따라서 캐싱은 한 번의 반입이 성공적으로 완료 (= 해결) 된 경우에만 작동합니다. 중복 쿼리를 피하기 위해 첫 번째 가져 오기가 완료 될 때까지 기다릴 코드를 어떻게 개선 할 수 있습니까?node.js에서 동일한 URL을 두 번 호출하여 가져 오기를 방지하는 방법

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

은 또한지도의 새로운 값을 설정하기 위해, 당신은 set 방법을 사용할 필요가 있습니다를, cache[url]이 올바르지 않습니다.

+0

'fetch'의 결과를 캐싱하는 것은 적절하지 않습니다. 왜냐하면 일단 해당 본문이 사용되면 다시 사용할 수 없기 때문입니다 - 가져 오기가 브라우저에서 가져 오기와 동일하다고 가정 할 경우 - 'loadCached ('xxx '). (결과 => console.log (result))'는 한 번만 작동합니다 - 캐시의 사용을 무효화합니다 : p - 대신 promise.then (return => response.clone(). text())를 반환 할 수 있습니다. –

+0

고마워요. 나는이 작업을 확인했고 node.js의 경우 복제가 필요하다. –

+0

@ dfsq 제발 도와주세요! https://stackoverflow.com/questions/47369109/phantomjs-does-not-support-audio-tag – ikerya