lodash:v3.10.1与v2.4.1不兼容。如何向后兼容?

时间:2015-09-11 02:06:06

标签: lodash

遇到以下不同之处:
例1

var s = [];
var anArray = [1,2,3];
var iterateeFunction = function(n){
       s.push(n);
}

_( anArray ).forEach( iterateeFunction )

输出:

  • v2.4.1:s = [1,2,3]
  • v3.10.1:s = []

示例2

_.first([1, 2, 3], 2);

输出:

  • v2.4.1: [1,2]
  • v3.10.1: 1

不确定这是不是真的不兼容! @ John-David Dalton:请告知:有什么需要改变这个?兼容性问题仅适用于此!我不认为这是一个充分的原因。

这可能是使用lodash的错误方式,但在旧版本上它无论如何都有效。 我想可能会有更多这样的例子。所以我的问题是

  1. 还有这样的情况吗?将项目的当前版本更改为最新版本会有多大的风险?
  2. 如何处理这些问题,以便旧功能保持不变+我还可以使用v3.10.1中较新的实用程序功能?
  3. 我非常喜欢v3.10.1,我很乐意升级!

1 个答案:

答案 0 :(得分:1)

这种差异与new lazy sequences added in version 3

有关

结果是用于副作用的each/forEach处理导致了很多混乱,并且" bug"报告 - 请参阅"Lazy each should cause immediate evaluation""Each doesn't execute callbacks when wrapped"

延迟序列处理的更改可能会破坏期望立即执行的任何序列操作回调 (即。执行副作用),否则不会立即强迫或实现。问题最常见于each/forEach用法 - 传递顺序通常被忽略 - 但它也可能出现在其他意外延迟的情况下。执行。

要使v3代码像以前一样,强制或"展开" value的序列。

   _( anArray ).forEach( iterateeFunction ).value()
//   ^-- creates lazy sequence
//              ^-- so this doesn't "run" the callback
//                                          ^-- until unwrapped

或者,更好的是,使用非包装形式:

_( anArray, iterateeFunction )

或更好的是,与ES5兼容的功能(数组作为对象):

anArray.forEach(iterateFunction)