Underscore.js的“some”函数未返回布尔值

3

我正在使用underscore.js来检查列表中的元素是否为真。以下是其对应的coffeescript代码:

uploading  = _(@getViews ".file-forms").some (view) ->
    view.uploading is true

打印“上传”,而不是返回true或false,得到:

uploading
  y
   _chain: true
   _wrapped: false
   __proto__: Object

以下是'underscore'中'some'的定义:http://underscorejs.org/#some
此外,'getViews'是backbone layoutmanager中的一个函数,在此处定义:https://github.com/tbranyen/backbone.layoutmanager/wiki/Nested-views
以下是其他可能有助于调试的变量输出:
_(this.getViews(".file-forms"))
 y
  _chain: true
  _wrapped: Array[1]
  0: d
  length: 1
  __proto__: Array[0]
  __proto__: Object

_
 function (a){if(a instanceof y)return a;if(this instanceof y)this._wrapped=a;else return new y(a)}

1
你能展示一下你的JavaScript输出吗?看起来它在没有调用value()的情况下调用了chain() - Plynx
我使用console.log(uploading)将其打印出来(输出如上所示)。您所说的“输出javascript”是指通过编译coffeescript生成的javascript吗?您可以在此处复制粘贴coffeescript:http://coffeescript.org/,然后在“Try Coffeescript”下查看它。 - zimkies
在JavaScript / Underscore中,它能正常工作。你可能有一个Coffeescript或Backbone的问题。你能展示一下 getViews 和环境中字面上的 _ 的结果吗? - Plynx
是的,已将其添加到问题中。 - zimkies
2个回答

2

如果你查看getViews,你会看到发生了什么:

getViews: function(fn) {
  //...
  if (typeof fn === "string") {
    return _.chain([this.views[fn]]).flatten();
  }
  //...
}

如果您查看所有可能的返回值,您会发现它们都是_.chain调用的结果,没有_.value调用来剥离链接包装器。这意味着getViews返回一个可链接的Underscore包装器,而不是您期望的简单数组。
您不应该使用_(@getViews '...'),因为getViews返回值已经被包装在Underscore中。相反,您应该尝试像下面这样做:
uploading = @getViews(".file-forms").some((view) -> view.uploading is true).value()

顺便提一下,我对你的 v.uploading is true 测试有些怀疑;对 truefalse 的显式检查可能会导致奇怪的行为(尤其是在 CoffeeScript 中,is 实际上是 ===)。我可能会使用 (v) -> v.uploading 作为函数。当然,这是个人偏好。


2

getViews 似乎返回了一个预包装和链接的 underscore 对象供您使用。在这种情况下,再次调用 _ 不起作用。您可以使用 uploading.value() 来获取所需的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接