承诺是我在Javascript中管理异步代码的首选方法。Memoize (关于npm的回忆录)是一个Javascript库,可以方便地缓存和预取函数的结果。
理想情况下,我希望将两者的优点结合起来,并且能够“过期”一个承诺并预先获取一个新的承诺结果(当缓存被触摸并接近到期时)。追忆可以做到这一点,但它不是建立在承诺的头脑中。
(我知道承诺有一个内置的“永久缓存”,这是它们的本质,但对于我的应用程序来说,永远太长了)
到目前为止,我最好的尝试如下(node.js示例使用bluebird、memoize和underscore):
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库提供的所有缓存到期(+更多)功能。
然而,在我看来,这种方法似乎是杂乱无章的,而且设计过度了。我想
这是我想做的最好的方法吗?还有另一个图书馆,如回忆录,是专为承诺而设计的吗?有没有我错过的更简单的解决方案?
如有任何指导,将不胜感激。
发布于 2014-10-22 14:00:38
这个函数将允许我回溯一个异步函数(带有类似节点的回调)返回一个承诺。然而,在我看来,这种方法似乎是杂乱无章的,而且设计过度了。
是的--你已经有了一个函数返回一个承诺,没有理由回到旧事重提。
有没有我错过的更简单的解决方案?
返回承诺的函数只是返回某些值的函数--一个可以由memoize函数缓存的值。简单地做
memoize(funcReturningPromise, options)发布于 2014-10-21 16:12:25
你正确地理解了承诺--一个承诺是一个价值的代理--一旦它被设定,它就永远不会改变。
唯一的解决办法就是不要每次都返回相同的承诺--每次都必须返回不同的承诺(就像您的示例所做的)。最简单的解决方案是使用memoize和允诺返回函数(并且它会缓存对值的承诺)。
如果我们有一个返回承诺的function foo(){。完全可以只使用函数本身的memoize,然后使用库提供的所有工具。
注意:promisify很昂贵,并且产生一个非常快的函数--您真的不想在运行时调用它。您可以简单地在代码中返回new Promise。
https://stackoverflow.com/questions/26485662
复制相似问题