Javascript中的缓存和预取过期承诺

Caching and pre-fetching expiring promises in Javascript

本文关键字:预取 过期 承诺 缓存 Javascript      更新时间:2023-09-26

Promises是我在Javascript中管理异步代码的首选方式。Memoize(Memoize on npm)是一个易于缓存的Javascript库;函数的预取结果。

理想情况下,我希望两者兼而有之,并能够"过期"Promise并预取新的Promise结果(当缓存被触摸且即将过期时)。Memoize可以做到这一点,但它并不是在考虑承诺的情况下构建的。

(我知道Promises有一个内置的"永远缓存",这是它们的本质,但永远对我的应用程序来说太长了)

到目前为止,我最好的尝试如下(node.js使用bluebird、memory和下划线的示例):

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));
};

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

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

这是我想做的最好的方法吗?有没有其他像memoize这样专门为承诺而设计的图书馆?有没有我错过的更简单的解决方案?

如有任何指导,我们将不胜感激。

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

是的-您已经有一个函数返回promise,没有理由返回nodebacks。

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

返回promise的函数只是返回某个值的函数,该值可以由memoize函数缓存。只需进行

memoize(funcReturningPromise, options)

您正确理解promise-promise是一个值的代理-一旦设置好,它就永远不会改变。

唯一的方法是不要每次都返回相同的承诺-你必须每次都返回不同的承诺(就像你的例子一样)。最简单的解决方案是使用带有promise返回函数的memoize(它会缓存值的promise)。

如果我们有一个返回承诺的function foo(){。只需要memoize本身发挥作用,然后使用库提供的所有工具,这是完全可以的。

注意:promisify非常昂贵,并且生成一个非常快的函数——您真的不想在运行时调用它。您可以简单地在代码中返回new Promise