在Javascript中缓存和预取即将到期的承诺

Mik*_*uso 7 javascript memoization node.js promise bluebird

Promise是我在Javascript中管理异步代码的首选方式.Memoize(memoizee on npm)是一个Javascript库,用于轻松缓存和预取功能结果.

理想情况下,我希望将两者中的优点结合起来,并且能够"过期"Promise并预先获取新的Promise结果(当缓存被触及并接近到期时).Memoize可以做到这一点,但它并没有考虑到Promise.

(我知道Promises有一个内置的"永远缓存",因为它们的性质,但对我的应用来说永远是太久了)

到目前为止,我做到这一点的最佳尝试如下(使用bluebird,memoizeunderscore的 node.js示例):

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));
};
Run Code Online (Sandbox Code Playgroud)

这个函数将允许我记忆异步函数(具有类似节点的回调)返回一个promise,同时还提供Memoize库提供的所有缓存到期(+更多)功能.

然而,这种方法对我来说似乎很乱并且过度设计.我想我自己 - 这肯定是一个常见的问题,而其他人已经提出了更优雅的解决方案吗?

这是我尝试做的最好的方法吗?还有另一个像memoize这样专门为promises设计的库吗?我错过了一个更简单的解决方案吗?

任何指导将不胜感激.

Ber*_*rgi 1

这个函数将允许我记住一个返回承诺的异步函数(带有类似节点的回调)。然而,这种方法对我来说似乎很混乱并且过度设计。

是的 - 你已经有一个返回 Promise 的函数,没有理由返回到 Nodebacks。

有没有我错过的更简单的解决方案?

返回 Promise 的函数只是返回某个值的函数 - 可以由函数缓存的值memoize。简单地做

memoize(funcReturningPromise, options)
Run Code Online (Sandbox Code Playgroud)