基于承诺的功能的记忆

Ben*_*Ben 7 javascript memoization promise

如何记忆基于承诺的功能?

直截了当的功能记忆就够了吗?

function foo() {
    return new Promise((resolve, reject) => {
      doSomethingAsync({ success: resolve, fail: reject });
    });
};
Run Code Online (Sandbox Code Playgroud)

这样就够了吗?

var fooMemoized = memoize(foo);
Run Code Online (Sandbox Code Playgroud)

注意:此问题已更新,以删除延迟反模式.

Ber*_*rgi 12

是的,这就足够了.Promise是简单的返回值,这是它们的巨大好处 - 与回调相比,memoisation代码会很糟糕.

如果您的诺言库确实支持某种取消,您可能只想确保备忘的承诺是无法撤销的.另请注意,这种形式的记忆也会记住拒绝,因此您无法通过"再次尝试"来从错误中恢复.


Vit*_*aly 5

对于Promise,简单的同步备忘会不好用,因为在大多数情况下,您不希望记录错误(已拒绝的Promise)。

我为常见需求做了一个简单的库:https : //github.com/nodeca/promise-memoize

  1. 它记住基于Promise的功能,默认情况下会出错
  2. 您可以设置结果的到期时间
  3. 如果需要,您也可以记住(并设置到期时间)是否有错误。
  4. 可以在到期之前预取数据,以使缓存永远不会处于冷态。

伪代码:

let db = require('mongoose').createConnection('mongodb://localhost/forum');

function lastPosts(limit) {
  return db.model('Post').find()
    .limit(limit).orderBy('-_id').lean(true).exec(); // <- Promise (thenable)
}

let cachedLastPosts = require('promise-memoize')(lastPosts, { maxAge: 60000 });

// Later...
cachedLastPosts(10).then(posts => console.log(posts));
Run Code Online (Sandbox Code Playgroud)