Javascript/Coffeescript 使用函数哈希作为参数
Javascript/Coffeescript Using Hash of Functions As Argument
我有一些 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 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)
有人知道为什么第一个代码失败而简化的示例有效吗?
谢谢!
您没有正确使用 _.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
returns true
对于任何它不理解的东西。
如果您想查看某个东西是否是函数,_.isFunction
可能会更好:
throw 'requires update callback' unless _.isFunction(callbacks.update)
我有一些 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 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)
有人知道为什么第一个代码失败而简化的示例有效吗?
谢谢!
您没有正确使用 _.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
returns true
对于任何它不理解的东西。
如果您想查看某个东西是否是函数,_.isFunction
可能会更好:
throw 'requires update callback' unless _.isFunction(callbacks.update)