Промисы — это мой предпочтительный способ управления асинхронным кодом в Javascript. Memoize (memoizee на npm) — это библиотека Javascript для простого кэширования и предварительной выборки результатов функций.
В идеале я хочу объединить лучшее из обоих и иметь возможность «истекать» обещание и предварительно извлекать новый результат обещания (когда кеш затронут и близок к истечению). Memoize может это сделать, но он не был создан с учетом промисов.
(Я понимаю, что промисы имеют встроенный «вечный кеш», как и их природа, но навсегда слишком долго для моего приложения)
На данный момент моя лучшая попытка сделать это выглядит следующим образом (пример 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