用例 - 獲取一堆網址並緩存結果。那些完成速度很快(比如說500ms)的程序會被合併到這個過程中,任何需要比這個過程更長的時間才能完成並保存到緩存中,這樣下一次(大約10分鐘後,在我們的應用程序中)它們就會進入緩存。Promise.some()有超時?
我希望能夠做些類似於Promise.someWithTimeout(promises, timeout)
的地方,其結果是在超時過期之前完成的解析值數組。 (Promise.some()
是非常接近所花費的計數不超時)
喜歡的東西
Promise.someWithTimeout([promises], <timeout value>)
.then((results) => {
//stuff
})
這裏每個承諾看起來像
return memcache.getAsync(keyFromUrl(url))
.then((cacheRes) => {
if(cacheRes) return cacheRes;
//not in cache go get it
return rp(url)
.then((rpRes) => {
//Save to cache but don't wait for it to complete
memcache.setAsync(keyFromUrl(url), rpRes, 86400).catch((e) => { /*error logging*/ })
return rpRes;
})
})
的想法是,如果該URL回來快速我們使用它,如果它需要更長時間我們保釋,但仍然緩存結果,所以下次通過我們擁有它。所以rp()
超時將比Promise.someWithTimeout()
一個更長一個
有沒有人寫了一個庫來做到這一點(我找不到一個),還是有更好的模式?我雖然關於使用Promise.all().timeout().finally()
的承諾將他們的結果存入一個數組,但它不合理,因爲我不能完全放下手指。
是否每次通過包括相同的「網址的束」或它們可以從通變化通過? –