Javascript/Coffeescript 使用函数哈希作为参数

标签 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 中运行的,并且是在启动时运行一次的东西。所以在node inspector里面不好看。至少我还没有想出怎么做。

无论如何,其中有趣的部分是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)

有人知道为什么第一个代码失败而简化的示例有效吗?

谢谢!

最佳答案

您没有正确使用 _.isEmpty。来自fine manual :

isEmpty _.isEmpty(object)

Returns true if an enumerable object contains no values (no enumerable own-properties). For strings and array-like objects _.isEmpty checks if the length property is 0.

函数不是可枚举对象,也不是字符串或类数组对象。你给 _.isEmpty 一些它不理解的东西,所以你调用了未指定的行为。结果是 _.isEmpty 对任何它不理解的内容返回 true

如果你想看看某个东西是否是一个函数,_.isFunction可能会更好地为您服务:

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

关于Javascript/Coffeescript 使用函数哈希作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27758979/

相关文章:

javascript - 绘制和删除圆弧 - 使用 JavaScript 或 CSS 的圆弧动画

javascript - Physicsjs - 使用 Sprite 表将一个位图的部分分配给多个主体

node.js - 将 CORS 模块添加到单个快速路线不起作用

javascript - Node : How to do nightmareJS e2e-testing on running docker application

c - 如何将可变大小数组从 Windows 内核驱动程序传递到用户模式进程?

python - 如何使用对象/方法对的回调函数

javascript - 测试失败 - 多次调用 Mocha 的 done()

javascript - 你如何使用增量?

javascript - 如何在 React State 中更新数组的奇异值

Javascript 内部 - clearTimeout 就在它触发之前