首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存和预取Javascript中的过期承诺

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

Stack Overflow用户
提问于 2014-10-21 11:32:20
回答 2查看 1.9K关注 0票数 7

承诺是我在Javascript中管理异步代码的首选方法。Memoize (关于npm的回忆录)是一个Javascript库,可以方便地缓存和预取函数的结果。

理想情况下,我希望将两者的优点结合起来,并且能够“过期”一个承诺并预先获取一个新的承诺结果(当缓存被触摸并接近到期时)。追忆可以做到这一点,但它不是建立在承诺的头脑中。

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

到目前为止,我最好的尝试如下(node.js示例使用bluebirdmemoizeunderscore):

代码语言:javascript
复制
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库提供的所有缓存到期(+更多)功能。

然而,在我看来,这种方法似乎是杂乱无章的,而且设计过度了。我想

这是我想做的最好的方法吗?还有另一个图书馆,如回忆录,是专为承诺而设计的吗?有没有我错过的更简单的解决方案?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-22 14:00:38

这个函数将允许我回溯一个异步函数(带有类似节点的回调)返回一个承诺。然而,在我看来,这种方法似乎是杂乱无章的,而且设计过度了。

是的--你已经有了一个函数返回一个承诺,没有理由回到旧事重提。

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

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

代码语言:javascript
复制
memoize(funcReturningPromise, options)
票数 1
EN

Stack Overflow用户

发布于 2014-10-21 16:12:25

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

唯一的解决办法就是不要每次都返回相同的承诺--每次都必须返回不同的承诺(就像您的示例所做的)。最简单的解决方案是使用memoize和允诺返回函数(并且它会缓存对值的承诺)。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26485662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档