我想知道是否建议通过传递和重用我创建的带链式懒散对象。
var filtered = _(nonFiltered).filter(...).map(...);
filtered.each(doStuff).value();
var reMapped = filtered.map(...).object(...);
//keep using reMapped and filtered, sometimes calling .value()以这种方式使用死锁对象安全吗?
发布于 2016-02-04 07:54:41
是的,你绝对可以做到!
Lodash (>= v3.2)为您提供所需的所有工具。这取决于您何时执行一个链(通过调用.commit() (见下文)或显式或隐式调用.value() ),您甚至可以通过注入不同的集合/数组/对象/值(通过调用.plant() (见下文)来重用以前创建的链。
然而,你应该考虑的是:
reMapped链,将再次执行初始的filter()和map()部件。即使您以前执行过filtered链。因此,就性能而言,在代码中的某个点执行一个链子并用一个新的锁包装包装结果可能是有意义的。这就是commit()在那里的目的。
nonFiltered=_(.).filter(.).map(.).commit();var reMapped = filtered .(.).commit()
通过这样做,您将执行该链,并将结果包装在一个新的目录包装器中。当然,这与plant()不能很好地结合(见下文)。
commit()nonFiltered仍然指向同一个对象。也就是说,您不能创建您的链,并期望nonFiltered能够自动找到进入链的方法。这就是plant()存在的目的:
reMapped.plant(nonFiltered).value();
从技术上讲,当调用plant时,将克隆包装器,使原始包装器保持不变。就性能而言,克隆是可以忽略不计的。
plant()nonFiltered变量(更确切地说是它所指向的对象/数组)通常会被垃圾收集的情况。但是,只要存在包装器,垃圾收集器就无法清理。这只会对您的内存占用产生很小的影响,但取决于您创建的包装器的数量和存储它们的位置,这也可能意味着您的平均内存占用量可能会显著增加,这取决于您最终将在何时释放包装器。
最坏的情况是,例如,在某种长寿的对象上存储包装器(例如存储在角服务中),包装重量级$http响应的结果,可能包含大量无关的数据,在执行包装器时,这些数据将减少到原始大小的一小部分。
再一次,commit和plant伸出援手。您可以从两种策略中选择:1. Either create your chain with an empty value (like this: `_().filter(...)...`) and use `plant` before executing the chain (see (2.)).
2. Or just `commit` your chain immediately after you've defined it (see (1.))
https://stackoverflow.com/questions/35095913
复制相似问题