在Javascript中caching和预取过期的承诺

承诺是我在JavaScript中pipe理我的asynchronous代码的首选方式。 Memoize(npm上的memoizee)是一个Javascript库,用于轻松caching和预取函数的结果。

理想情况下,我想结合两者中的优点,并有能力“超期”承诺并预先获取新的Promise结果(当caching被触摸并即将到期时)。 Memoize可以做到这一点,但它不是build立在Promise的基础上。

(我知道Promise有一个内置的“永久caching”,就像它们的本质一样,但是对于我的应用来说永远太长了)

我迄今为止做的最好的尝试如下(使用蓝鸟 , memoize和下划线的 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)); }; 

这个函数将允许我记忆一个asynchronous函数(带有类似节点的callback函数)返回一个promise,同时也提供Memoize库提供的所有cache-expiry(+ more)function。

但是,这种方法似乎凌乱和过度devise给我。 我认为对于我自己来说 – 当然这是一个常见的问题,别人已经提出了一个更优雅的解决scheme?

这是我想要做的最好的方法吗? 还有另外一个专门为承诺而devise的图书馆吗? 有没有更简单的解决scheme,我错过了?

任何指导将不胜感激。

这个函数将允许我记忆一个asynchronous函数(带有类似节点的callback函数)返回一个promise。 但是,这种方法似乎凌乱和过度devise给我。

是的 – 你已经有一个函数返回一个promise,没有理由回到nodeback。

有没有更简单的解决scheme,我错过了?

返回一个promise的函数只是一个返回值的函数 – 一个可以被memoize函数caching的值。 简单地做

 memoize(funcReturningPromise, options) 

你正确理解承诺 – 一个承诺是一个价值的代理 – 一旦设定,它永远不会改变。

唯一的解决办法就是不要每次都回复同样的承诺 – 每次都必须返回一个不同的承诺(就像你的例子那样)。 最简单的解决scheme是使用memoize和promise函数(它会caching值的承诺 )。

如果我们有一个function foo(){返回一个promise。 只memoize这个函数本身,然后使用库提供的所有工具是完全正确的。

注意: promisify是昂贵的,并产生一个非常快速的function – 你真的不想在运行时调用它。 你可以直接在你的代码中返回new Promise