Obietnice są moje preferowany sposób zarządzania moje asynchronicznego kodu w JavaScript. Funkcja memoize (memoizee on npm) jest biblioteką JavaScript umożliwiającą łatwe buforowanie & z wyprzedzeniem przy pobieraniu wyników funkcji.buforowanie i pre-ściągam wygasające obietnic w JavaScript
Idealnie chcę połączyć to, co najlepsze, i mieć możliwość "wygaśnięcia" obietnicy i otrzymania nowego wyniku Obietnicy (gdy pamięć podręczna zostanie dotknięta i bliska wygasaniu). Memoize może to zrobić, ale nie jest zbudowany z myślą o obietnicach.
(rozumiem, że obietnice mają wbudowany „forever-cache”, jak jest ich natura, ale zawsze jest zbyt długi dla mojej aplikacji)
Moja najlepsza próba to zrobić do tej pory jest w następujący sposób (node.js przykład stosując bluebird, memoize i underscore):
var memoize = require('memoizee')
, Promise = require('bluebird')
, _ = require('underscore')
;
// returns a memoized Promise-generating function
function memoizePromiser(funcReturningPromise, options) {
var opts = _.defaults(options || {}, {async: true});
return Promise.promisify(memoize(function(){
var args = _.initial(arguments);
var cb = _.last(arguments);
funcReturningPromise.apply(this, args).nodeify(cb);
}, opts));
};
funkcja ta pozwoli mi memoize funkcję transmisji asynchronicznej (z węzłem-jak wywołania zwrotne) powrocie obietnicę, jednocześnie zapewniając cały cache-wygaśnięcie (+ więcej) funkcjonalności oferowanej przez librę Memoize ry.
Jednak takie podejście wydaje się brudny i inżynierii do mnie. Myślę sobie - z pewnością jest to dość powszechny problem, który ktoś inny stworzył bardziej eleganckim rozwiązaniem?
Jest to najlepsze podejście do tego, co mam zrobić? Czy istnieje inna biblioteka, taka jak memoize, która została zaprojektowana specjalnie dla obietnic? Czy istnieje prostsze rozwiązanie, które przegapiłem?
Wszelkie wskazówki będą mile widziane.
Czy możesz wyjaśnić, co dokładnie jest nie tak z 'memoize (funcReturningPromise, options)'? Może nie rozumiem, że istnieje specjalne zachowanie dotyczące wygasania itp. Z funkcjami asynchronicznymi, czy tak jest? – Bergi
Eureka! Dziękuję za wskazanie tego. Byłem pochłonięty ideą, że odkąd miałem do czynienia z kodem asynchronicznym, musiałem skorzystać z asynchronicznej funkcjonalności memoize (włączając w to niechlujny callback podobny do węzła) - ale ja nie; Obietnica jest zwracana synchronicznie. – Mikuso
Postaram się odpowiedzieć :-) – Bergi