首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能/建议重复使用延迟寄存对象?

是否有可能/建议重复使用延迟寄存对象?
EN

Stack Overflow用户
提问于 2016-01-29 23:23:29
回答 1查看 499关注 0票数 1

我想知道是否建议通过传递和重用我创建的带链式懒散对象。

代码语言:javascript
复制
var filtered = _(nonFiltered).filter(...).map(...);

filtered.each(doStuff).value();

var reMapped = filtered.map(...).object(...);

//keep using reMapped and filtered, sometimes calling .value()

以这种方式使用死锁对象安全吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-04 07:54:41

是的,你绝对可以做到!

Lodash (>= v3.2)为您提供所需的所有工具。这取决于您何时执行一个链(通过调用.commit() (见下文)或显式或隐式调用.value() ),您甚至可以通过注入不同的集合/数组/对象/值(通过调用.plant() (见下文)来重用以前创建的链。

然而,你应该考虑的是:

  1. Performance --整个链将在每次执行该链时执行。例如,在您的示例中,如果执行reMapped链,将再次执行初始的filter()map()部件。即使您以前执行过filtered链。因此,就性能而言,在代码中的某个点执行一个链子并用一个新的锁包装包装结果可能是有意义的。这就是commit()在那里的目的。 nonFiltered=_(.).filter(.).map(.).commit();var reMapped = filtered .(.).commit() 通过这样做,您将执行该链,并将结果包装在一个新的目录包装器中。当然,这与plant()不能很好地结合(见下文)。 commit()
  2. 变量生命周期--而且,在执行链时,您需要特别注意,初始变量nonFiltered仍然指向同一个对象。也就是说,您不能创建您的链,并期望nonFiltered能够自动找到进入链的方法。这就是plant()存在的目的: reMapped.plant(nonFiltered).value(); 从技术上讲,当调用plant时,将克隆包装器,使原始包装器保持不变。就性能而言,克隆是可以忽略不计的。 plant()
  3. Memory Management --如果您过于随意地传递包装器,最终可能会出现nonFiltered变量(更确切地说是它所指向的对象/数组)通常会被垃圾收集的情况。但是,只要存在包装器,垃圾收集器就无法清理。这只会对您的内存占用产生很小的影响,但取决于您创建的包装器的数量和存储它们的位置,这也可能意味着您的平均内存占用量可能会显著增加,这取决于您最终将在何时释放包装器。 最坏的情况是,例如,在某种长寿的对象上存储包装器(例如存储在角服务中),包装重量级$http响应的结果,可能包含大量无关的数据,在执行包装器时,这些数据将减少到原始大小的一小部分。 再一次,commitplant伸出援手。您可以从两种策略中选择:
代码语言:javascript
复制
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.))

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35095913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档