Javascript subline.js u3;.tap()函数什么是方法链?

Javascript subline.js u3;.tap()函数什么是方法链?,javascript,underscore.js,chaining,method-chaining,Javascript,Underscore.js,Chaining,Method Chaining,Underline.js文档解释了..tap()函数“taps”进入方法链 我很难效仿他们的榜样: _.chain([1,2,3,200]) .filter(function(num) { return num % 2 == 0; }) .tap(alert) .map(function(num) { return num * num }) .value(); => // [2, 200] (alerted) => [4, 40000] 在这种情况下,方法链是什么?

Underline.js文档解释了
..tap()
函数“taps”进入方法链

我很难效仿他们的榜样:

_.chain([1,2,3,200])
  .filter(function(num) { return num % 2 == 0; })
  .tap(alert)
  .map(function(num) { return num * num })
  .value();
=> // [2, 200] (alerted)
=> [4, 40000]
在这种情况下,方法链是什么?我一直认为方法链接是将方法相互链接的概念:
object.foo().bar().baz()


我看到过使用此方法的示例:
module.exports=\uu.tap{},(connectors)->
,那么这个“tap”进入对象文本的方法链吗?

方法链,正如您所描述的,将方法彼此链接起来。关于
\uu.tap
的关键细节是将每个方法的结果传递给下一个

\点击可插入结果未通过的方法。上一个方法的结果将传递给
之后的方法。这允许在不改变链结果的情况下处理链中的中间结果


在您的示例中,
警报
如果单独调用,将断开链,因为它不会返回任何内容。使用
.tap
,会将上一个方法(
filter(function(num){return num%2==0;})
)的结果传递给以下方法(
map(function(num){return num*num})

示例中的链是
filter().tap().map()

  • \uuu.chain([1,2,3300])
    将数组包装在下划线包装器中,该包装器具有
    过滤器
    点击
    映射
    等方法
  • .tap(alert)
    filter()
    中展开结果,使用展开的对象调用
    alert()
    ,然后再次将其包装并返回
  • .value()
    返回包装对象(减去包装)
来自:

链接
[…]
调用chain将导致所有未来的方法调用返回包装对象。完成计算后,使用检索最终值

因此,下划线上下文中的链接与其他地方的链接相同,只是在包装对象上链接下划线方法。首先调用
\uu0.chain
获取包装器:

_(obj).chain()
然后对
\uq.chain
返回的内容调用下划线方法,它们也将返回包装的对象:

_(obj).chain()
      .filter(function(x) { ... })
      .map(function(x) { ... })
      ...
最后,调用
\uu0.value
打开链接包装器:

var result = _(obj).chain()
                   .filter(function(x) { ... })
                   .map(function(x) { ... })
                   ...
                   .value();
返回到
。点击
。全部:

因此,它对被迭代的值调用传递的函数,
interceptor
,并返回被迭代的内容,而不对其执行任何操作<代码>\轻触
与:

.map(function(x, func) { func(x); return x })

但它清楚地表明了你的意图。实际上,
.tap
可以让你窥视通过方法链传递的数据,而不改变这些数据。

我同意文档中的例子很愚蠢,因为
警告
在真实情况下你永远不会想做迭代对象(除非您正在调试并想知道两个链接方法之间对象的状态-但在这种情况下,它可能只是发出警报
[object object]
控制台。log
更合适,但不会按预期工作[但我离题])。下面是一个非链接工作流的示例:

var x = { a: 1, b: 2, c: 3 };

x = _.filter( x, function( value ){
  return ( value % 2 === 0 );
} );

x.length = _.size( x );

x = _.pairs( x );
这个场景确实适合于链接:上面的所有代码本质上都是创建和连续修改一个对象。链接清楚地表明了这一点,并阻止了您不断地编写作业。唯一的问题是我声明
长度的那一行-
-它不适合链接,因为它是唯一没有链接的语句这不仅仅是在对象上运行下划线方法并将结果分配回该对象。这就是
tap
的作用:您希望做一些不容易在链内链接的事情。以下是链接工作流的外观:

var x = _
  .chain( { a: 1, b: 2, c: 3 } )
  .filter( function( value ){
    return ( value % 2 === 0 );
  } )
  .tap( function( x ){
    x.length = _.size( x );
  } )
  .pairs()
  .value();

你能澄清一下你所说的
包装对象
是什么意思吗?一个对象文本
{obj}
?表示
\uux.chain(x)
\ux.chain()
x
包装在另一个对象中,该对象支持下划线函数。然后,每个下划线函数都会识别出它正在处理一个包装对象,并为链中的下一步维护包装器。感谢Barney,这个答案也有助于我的理解。我接受muistooshort的答案,即h这是第一个。谢谢,这帮了大忙
var x = _
  .chain( { a: 1, b: 2, c: 3 } )
  .filter( function( value ){
    return ( value % 2 === 0 );
  } )
  .tap( function( x ){
    x.length = _.size( x );
  } )
  .pairs()
  .value();