Обещанията са моят предпочитан начин за управление на моя асинхронен код в Javascript. Memoize (memoizee на npm) е Javascript библиотека за лесно кеширане и предварително извличане на резултати от функции.
В идеалния случай искам да комбинирам най-доброто от двете и да имам възможността да "изтеча" Promise и предварително да извлека нов резултат от Promise (когато кешът е докоснат и е близо до изтичане). Memoize може да направи това, но не е създаден с предвид Promises.
(Разбирам, че Promises имат вграден "forever-cache", както е в природата им, но forever е твърде дълго за моето приложение)
Най-добрият ми опит да направя това досега е както следва (пример на node.js с използване на bluebird, memoize и долна черта):
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));
};
Тази функция ще ми позволи да мемоизирам асинхронна функция (с подобни на възел обратни извиквания), връщаща обещание, като същевременно предоставя цялата функционалност за изтичане на кеша (+ още), предлагана от библиотеката Memoize.
Този подход обаче ми изглежда объркан и прекалено проектиран. Мисля си - сигурно това е достатъчно често срещан проблем, ако някой друг е направил по-елегантно решение?
Това ли е най-добрият подход за това, което се опитвам да направя? Има ли друга библиотека като memoize, която е предназначена специално за обещания? Има ли по-просто решение, което съм пропуснал?
Всякакви насоки ще бъдат оценени.
memoize(funcReturningPromise, options)
? Може би не разбирам, че има специално поведение по отношение на изтичане и т.н. с асинхронни функции или така, нали? - person Bergi   schedule 21.10.2014