Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的缓存和预取过期承诺_Javascript_Node.js_Promise_Memoization_Bluebird - Fatal编程技术网

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

Javascript中的缓存和预取过期承诺,javascript,node.js,promise,memoization,bluebird,Javascript,Node.js,Promise,Memoization,Bluebird,承诺是我用Javascript管理异步代码的首选方式。 Memoize(npm上的memoizee)是一个Javascript库,用于轻松缓存和预取函数的结果 理想情况下,我希望结合两者的优点,并且能够“终止”承诺并预取一个新的承诺结果(当缓存被触动并且即将终止时)。Memoize可以做到这一点,但它的设计并没有考虑到承诺 (我知道Promissions有一个内置的“永久缓存”,这是它的本质,但forever对于我的应用程序来说太长了) 到目前为止,我最好的尝试如下(node.js示例使用和):

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

理想情况下,我希望结合两者的优点,并且能够“终止”承诺并预取一个新的承诺结果(当缓存被触动并且即将终止时)。Memoize可以做到这一点,但它的设计并没有考虑到承诺

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

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

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

然而,对我来说,这种方法似乎杂乱无章,设计过度。我对自己说——这肯定是一个很常见的问题,其他人提出了一个更优雅的解决方案

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


任何指导都将不胜感激。

您正确理解承诺-承诺是价值的代表-一旦设定,它将永远不会改变

解决这个问题的唯一方法是不要每次都返回相同的承诺——每次都必须返回不同的承诺(就像您的示例所做的那样)。最简单的解决方案是使用
memoize
和promise返回函数(它将promise缓存为值)

如果我们有一个返回承诺的
函数foo(){
,只需
记忆该函数本身,然后使用库提供的所有工具就可以了

注意:
promisify
价格昂贵,生成的函数速度非常快-您确实不想在运行时调用它。您只需在代码中返回
new Promise

这个函数允许我记忆一个异步函数(带有类似节点的回调),返回一个承诺

是-您已经有了一个返回承诺的函数,没有理由返回Nodeback

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

返回承诺的函数只是返回某个值的函数,该值可以由
memoize
函数缓存

memoize(funcReturningPromise, options)

嗯,你能解释一下记忆(funcReturningPromise,options)的错误吗
?也许我不明白异步函数的过期等有什么特殊行为,是吗?尤里卡!谢谢你指出这一点。我当时的想法是,既然我在处理异步代码,我就必须利用memoize的异步功能(包括混乱的节点状回调)-但我没有;承诺是同步返回的。我会给出一个答案:-)如果funcReturningPromise失败了怎么办?你在缓存失败吗?@PhilC:是的,在这种情况下,被拒绝的承诺会被缓存。我认为这是意料之中的,但回忆录的目的是防止多个请求。如果你不想这样,你仍然可以捕获拒绝,或清除回忆录缓存。明白了。我查看它是为了存储好的值,仅当您说我需要捕获拒绝并确保它们不会进入缓存时-thanks@PhilC:请注意,要正常工作,承诺应该在您知道它将被拒绝之前进入缓存。因此,如果没有一个解决方案如果从拒绝承诺(例如重试)中删除承诺,您可能希望在拒绝时将其从缓存中删除。
memoize(funcReturningPromise, options)