Javascript中的缓存和预取过期承诺
Caching and pre-fetching expiring promises in Javascript
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
。
- 使用twitter typeahead插件过滤预取的数据
- Typeahead.js未显示预取数据的自定义模板
- Typeahead.js远程工作,但预取不工作't
- 如何使用主干对集合进行预取
- 显示所有预取基准
- 推特打字前猎犬没有预取
- 使用Typeahead.js'显示总结果计数;s预取
- Javascript中的缓存和预取过期承诺
- Typeahead.js预取选项不起作用
- 引导类型提前预取功能
- rails应用程序中的Typeahead:将JSON请求仅附加到一个特定请求,而不是通过预取将JSON请求附加到每个请求
- 主干:预取集合
- 使用DOM注入动态预取资源是否有效或有意义
- 可以扩展链接预取,以便从远程文件加载文档元素中的 HTML
- 预取templateCache美元
- 使用typeahead.js预取过滤器(使用基本选项)
- 悬停时预取预呈现多个页面
- 需要预先输入本地、预取或远程
- 提前输入-预取
- Firefox插件预取链接标签