Promise 是我在 Javascript 中管理异步代码的首选方式。
Memoize(npm 上的 memoizee)是一个 Javascript 库,用于轻松缓存和预取函数结果。
理想情况下,我想结合两者的优点,并且能够使 Promise“过期”并预取新的 Promise 结果(当缓存被触及并接近过期时)。 Memoize 可以做到这一点,但它并不是在构建时考虑到 Promise。
(我知道 Promise 有一个内置的“永久缓存”,这是它们的本质,但是forever对于我的应用程序来说太长了)
到目前为止,我最好的尝试如下(node.js 示例使用bluebird https://github.com/petkaantonov/bluebird, memoize https://github.com/medikoo/memoize and 下划线 http://underscorejs.org/):
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 的库是专门为 Promise 设计的?有没有我错过的更简单的解决方案?
任何指导将不胜感激。