在 Javascript 中缓存和预取过期的 Promise

2024-05-27

Promise 是我在 Javascript 中管理异步代码的首选方式。 Memoize(npm 上的 memoizee)是一个 Javascript 库,用于轻松缓存和预取函数结果。

理想情况下,我想结合两者的优点,并且能够使 Promise“过期”并预取新的 Promise 结果(当缓存被触及并接近过期时)。 Memoize 可以做到这一点,但它并不是在构建时考虑到 Promise。

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

到目前为止,我最好的尝试如下(node.js 示例使用bluebird https://github.com/petkaantonov/bluebird, memoize https://github.com/medikoo/memoize and 下划线 http://underscorejs.org/):

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 库提供的所有缓存过期(+更多)功能。

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

这是我想做的事情的最佳方法吗?是否有另一个类似 memoize 的库是专门为 Promise 设计的?有没有我错过的更简单的解决方案?

任何指导将不胜感激。


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

是的 - 你已经有一个返回 Promise 的函数,没有理由返回到 Nodebacks。

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

返回 Promise 的函数只是返回某个值的函数 - 可以由memoize功能。简单地做

memoize(funcReturningPromise, options)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Javascript 中缓存和预取过期的 Promise 的相关文章

随机推荐

  • 如何将 Linq 扩展到 SQL?

    去年 斯科特 格思里stated http weblogs asp net scottgu archive 2007 07 31 linq to sql debug visualizer aspx 如果你想绝对控制执行的 SQL 你实际上可
  • Mongodb:如果比较运算符有效,为什么将字符串日期转换为 ISOdate?

    我有以下类型的文档 id ObjectId 538d64a11ca6e50941fda4d9 id 538d518e20b8fd642e0000e8 posts some stuff date 2014 06 02 对字符串日期 不是 Mo
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • Wasm DOM 访问和引用类型

    我一直非常密切地关注 WebAssembly 的路线图 特别是调用 JS 互操作的性能影响 作为本次活动的一部分参考类型提案 https github com WebAssembly reference types blob master
  • 在 scala 中保留推导的更高类型

    我有一个高阶类型 并致力于用它构建一些 DSL 我正在寻找一种方法来定义可以接受类型而无需显式指定此类型的函数 自我描述示例 class Wrap T val data T class DSL def doSomething T x Wra
  • Phonegap Geolocation:应用程序关闭时跟踪位置

    我已经按照教程进行了移动 tutsplus http mobile tutsplus com tutorials mobile web apps build an exercise tracking app persistence grap
  • python数据结构(类似设置)在添加重复项时抛出异常

    我正在寻找一种在添加重复元素时会引发异常的数据结构 我发现的最接近的是collections Counter gt gt gt from collections import Counter as counter gt gt gt c co
  • 在 iPhone 的日期选择器中插入空白值

    我有一个日期选择器 使用操作表显示 我想在日期选择器中插入一个空白值并将其设置为默认值 它应该仅根据用户选择而改变 这可能吗 如果是的话怎么办 感谢所有宝贵的建议 UIDatePicker 仅支持某些模式 并且不允许这种自定义 将空白或自定
  • UITextField:键盘出现时移动视图

    我目前正在开发一个具有单个视图的 iPhone 应用程序 该应用程序有多个 UITextFields 用于输入 当键盘显示时 它会覆盖底部的文本字段 所以我添加了相应的textFieldDidBeginEditing 方法 将视图向上移动
  • SQL Server xp_cmdshell

    有没有其他方法可以通过以下方式获取文件名列表T SQL以外 INSERT INTO backups filename EXEC master sys xp cmdshell DIR b c some folder with sql back
  • 从可变长度字符串中解析值的最佳方法是什么?

    假设我有一个由可变长度的逗号分隔的整数字符串 分割字符串并用值更新变量 如果存在 的最佳方法是什么 目前 我有以下内容 a b c 10 10 1 default values mylist int x for x in input spl
  • Visual C++ free 和 malloc 的线程安全性?

    有谁知道 free 和 malloc 在 Visual C 2010 上是否是线程安全的 我遇到了奇怪的问题 内存被损坏 我几乎认为这是唯一的可能性 有谁知道安全装置是否可以打开和关闭以及如何打开和关闭 前提是您链接的是线程安全库 http
  • C# Application Insight 失败:TrackEvent 未发送到 Azure Application Insight

    我对 Azure Application Insight 完全陌生 并尝试通过我的本地计算机发送 TrackEvent 但Azure Application Insight似乎没有收到任何信息 这是我的要求 规格 我安装了 applicat
  • 在 Linux 上,在 Eclipse CDT 中使用 gdb 调试 C++ 应用程序,如何向 stdin 输入内容?

    在 Linux 上 我尝试在 Eclipse CDT 中使用 gdb 调试 C 应用程序 例如应用程序applic exe接受一些命令行参数arg1 and arg2它期望一些数据stdin 比如说 取自文件input txt 通常 要在控
  • Python 删除额外的特殊 unicode 字符

    我正在 python 中处理一些文本 它内部已经采用 unicode 格式 但我想删除一些特殊字符并用更标准的版本替换它们 我目前有一条看起来像这样的线路 但它变得越来越复杂 我发现它最终会带来更多麻烦 tmp infile lower r
  • 如何读取其他应用程序的SharedPreferences(相同用户ID)?

    在安卓4 3上测试 我有两个应用程序 com my app first and com my app second 在我的活动中 我想读取其他应用程序的首选项 我选择对我的两个应用程序使用相同的用户 ID android sharedUse
  • 如何跳过 SSIS 数据流中的最后一行

    我在用FlatFile Source Manager gt Script COmponent as Trans gt OLEDB destination在我的数据流中 源从平面文件读取所有行 我想跳过更新数据库的最后一行 预告片记录 由于它
  • iPhone 4G 拍照时应用程序崩溃?

    我已从我的设备中拍摄照片并调整图像大小并将其设置到我的图像视图框架 但我的应用程序在拍摄照片后有时会崩溃 使用调整大小 现在我已经用 iPhone 4G 拍了这张照片 仅当许多应用程序在后台运行 多任务 时 应用程序才会崩溃 那么我该如何解
  • 在 Javascript 中缓存和预取过期的 Promise

    Promise 是我在 Javascript 中管理异步代码的首选方式 Memoize npm 上的 memoizee 是一个 Javascript 库 用于轻松缓存和预取函数结果 理想情况下 我想结合两者的优点 并且能够使 Promise