我在coffeescript中有以下功能:
newEdge: (fromVertexID, toVertexID) ->
edgeID = this.NOID
@client.methodCall('ubigraph.new_edge', [fromVertexID, toVertexID], (error, value) ->
if(error)
console.log('ubigraph.new_edge error: ' + error)
edgeID = value
)
edgeID
其中@ client.methodCall引用xmlrpc库。 我的问题是如何将值作为edgeID返回。我是否使用回调?
如果是这样,回调应该是这样的:?
# callback is passed the following parameters:
# 1. error - an error, if one occurs
# 2. edgeID - the value of the returned edge id
newEdge: (fromVertexID, toVertexID, callback) ->
@client.methodCall('ubigraph.new_edge', [fromVertexID, toVertexID], (error, value) ->
if(error)
console.log('ubigraph.new_edge error: ' + error)
edgeID = value
callback(error, value)
)
答案 0 :(得分:3)
是的,回调是异步调用的常用解决方案,有时你有回调调用回调调用回调,回调一直向下。我可能会做一点不同的事情:
newEdge: (fromVertexID, toVertexID, on_success = ->, on_error = ->) ->
@client.methodCall('ubigraph.new_edge', [fromVertexID, toVertexID], (error, edge_id) ->
if(error)
console.log('ubigraph.new_edge error: ' + error)
on_error(error)
else
on_success(edge_id)
)
主要区别在于我有单独的成功和错误回调,因此调用者可以单独处理这些条件,针对不同条件的单独回调是一种常见的方法,因此大多数人都应该熟悉它。我还添加了默认的无操作回调,以便回调是可选的,但主方法体可以假装它们一直被提供。
如果您不喜欢使用四个参数,那么您可以使用“named”参数进行回调:
newEdge: (fromVertexID, toVertexID, callbacks = { }) ->
@client.methodCall('ubigraph.new_edge', [fromVertexID, toVertexID], (error, edge_id) ->
if(error)
console.log('ubigraph.new_edge error: ' + error)
callbacks.error?(error)
else
callbacks.success?(edge_id)
)
使用对象/哈希作为回调,您可以使用existential operator而不是无操作来使回调可选。
Aaron Dufour注意到单个回调是Node.js中的常用模式,因此您的原始方法更适合node.js:
newEdge: (fromVertexID, toVertexID, callback = ->) ->
@client.methodCall('ubigraph.new_edge', [fromVertexID, toVertexID], (error, edge_id) ->
if(error)
console.log('ubigraph.new_edge error: ' + error)
callback(error, edge_id)
)