【发布时间】:2015-03-01 18:40:01
【问题描述】:
我有一些看起来像这样的 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 arguments。 inspect 只是将对象转换为 JSON 字符串,以便我可以读取它。结果总是{"0":{}}。
这就是我卡住的地方。我可以看到它正在传递一个哈希,但哈希中没有任何内容。更奇怪的是,当我用纯 Javascript 手写它时,也会发生同样的行为。
我试图减少它并重现它无济于事。此代码有效:
h =
f1: (a) -> 'one'
f2: (b) -> 'two'
test = (fn) ->
console.log fn.f1.call()
console.log fn.f2.call()
test(h)
有人知道为什么第一个代码失败而简化的示例有效吗?
谢谢!
【问题讨论】:
-
是的。它调用 JSON.stringify() (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。
-
@muistooshort-- 以
callbacks not null开头的console.log与您所说的非常相似:它检查了我期望的两个键/值对,它们都出现了undefined。我试图简化它,但从根本上说,我不明白为什么这些参数会出现一个空的哈希值。 -
原来代码没问题。出了问题的是
throw 'requires update callback' if _.isEmpty(callbacks.update)和相同的 insert 即使提供了回调,也会触发。出于某种原因,提供的函数被 Underscore 评估为空。删除引发异常的行解决了问题。所以我将重新构建这个问题:为什么这些没有回调的测试会评估为 true?
标签: javascript node.js callback coffeescript underscore.js