在lodash.js中,它是否会缓存`.value()`方法的结果?

6
例如,我有这样的代码(coffeescript):

sortedLatLng = _(w)
    .sortBy (x) -> x.time
    .map (x) -> [x.longitude,x.latitude]
    .uniq((x)-> x[0].toFixed(3) + "," + x[1].toFixed(3))   # keep three decimal to merge nearby points
console.log(sortedLatLng.value())
myFunction1(sortedLatLng.value())
myFunction2(sortedLatLng.value())
console.log(sortedLatLng.reverse().value())

这个方法以后可能会被其他 lodash 方法链接。同时,其值可能需要被提取。我只是在想它是否会缓存结果。在文档中没有找到它的实现方式。
对于以下情况,它将被计算一次还是两次?
myFunction1(sortedLatLng.value())
myFunction2(sortedLatLng.value())

有人对此有什么想法吗?


1
通过对两个.value()调用进行严格比较,您可以轻松地解决这个问题。 - idbehold
我使用lodash库已经遇到了三次问题。我得到了意外的结果,而且我也在想lodash是否正在执行一些我没有预料到的缓存操作。对我来说,在我的测试中所有的结果似乎表明lodash生成的对象以某种不方便我所需的方式持续存在/缓存。 - CtheGood
1个回答

1
创建 lodash 包装器时,包装值会存储在包装器内部。例如:
var wrapper = _([ 1, 2, 3 ]);

这里,[ 1, 2, 3 ] 存储在 wrapper 中,任何添加到wrapper的链式操作都会传递这个值。链式操作被存储而不是执行。例如:

var wrapper = _([ 1, 2, 3 ]).map(function(item) {
    console.log('mapping');
    return item;
});

这段代码创建了一个包装器,其中包含了一个map()操作,但它没有立即执行。相反,它存储了链接的操作,以便在调用value()时可以执行它们:
var wrapper = _([ 1, 2, 3 ]).map(function(item) {
    console.log('mapping');
    return item;
});

wrapper.value()
// mapping
// ...

在这个包装器上再次调用value()将简单地重复对包装值的相同操作 - 结果不会被缓存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接