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

时间:2015-05-22 03:07:44

标签: javascript coffeescript underscore.js lazy-evaluation lodash

例如,我有这样的代码(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 个答案:

答案 0 :(得分:1)

创建lodash包装器时,包装的值存储在包装器中。例如:

var wrapper = _([ 1, 2, 3 ]);

这里,[ 1, 2, 3 ]存储在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()将简单地对包装值重复相同的操作 - 结果不会被缓存。