Javascript / Coffeescript使用Hash of Functions作为参数

时间:2015-01-03 20:00:09

标签: javascript node.js callback coffeescript underscore.js

我有一些看起来像这样的Coffeescript(提前为复杂性道歉):

doc = new ChargerServerDoc(Chargers.find({id:site.id}), site)

doc.set_defaults().merge().needs_update
  update: (id, doc) ->
    Chargers.update id, $set: doc, (error, result) ->
      if error
        run_stats.error_count += 1
        "error"
      else
        run_stats.update_count += 1
        "update"

    return

  insert: (doc) ->
    Chargers.insert doc, (error, result) ->
      if error
        run_stats.error_count += 1
        "error"
      else
        run_stats.insert_count += 1
        "insert"

    return

它应该创建某种文档并实现对数据库的插入或更新作为回调。

needs_update: (callbacks = null) ->

  console.log inspect arguments

  if callbacks is null
    return true unless @is_equal(@working_document, @retrieved_document)
    return false
  else
    console.log """
    callbacks not null:
    insert: #{inspect callbacks['insert']}
    update: #{inspect callbacks['update']} 
    """
    data = @get()
    if @is_equal(@working_document, @retrieved_document)
      throw 'requires update callback' if _.isEmpty(callbacks.update)
      return callbacks.update.call(this, data._id, _.omit(data, '_id'))
    else
      throw 'require insert callback' if _.isEmpty(callbacks.insert)
      return callbacks.insert.call(this, _.omit(data, '_id'))

正如您所看到的,needs_update函数充满了console.log语句。这是在node.js中运行的,它是一次运行一次启动的东西。因此,在节点检查器中观察并不容易。至少我还没弄清楚怎么做。

无论如何,有趣的部分是console.log inspect argumentsinspect只是将对象转换为JSON字符串,以便我可以阅读它。结果始终为{"0":{}}

那就是我被困的地方。我可以看到它传递了一个哈希值,但哈希中没有任何内容。更奇怪的是,当我用纯Javascript手写它时会出现同样的行为。

我试图减少这个并重现它无济于事。此代码有效:

h =
  f1: (a) -> 'one'
  f2: (b) -> 'two'

test = (fn) ->
  console.log fn.f1.call()
  console.log fn.f2.call()

test(h)

有没有人知道为什么第一个代码失败而缩减示例有效?

谢谢!

1 个答案:

答案 0 :(得分:2)

您未正确使用_.isEmpty。来自fine manual

  

isEmpty _.isEmpty(object)

     

如果可枚举的对象不包含任何值(没有可枚举的自身属性),则返回 true 。对于字符串和类似数组的对象_.isEmpty,检查length属性是否为0。

函数不是可枚举对象,也不是字符串或类似数组的对象。您提供了_.isEmpty无法理解的内容,因此您需要调用未指定的行为。事实证明,_.isEmpty会返回true以获取它无法理解的任何内容。

如果你想看某件事是否是一个功能,_.isFunction可能会更好地为你服务:

throw 'requires update callback' unless _.isFunction(callbacks.update)