如何从异步调用返回值

时间:2012-02-22 19:09:16

标签: node.js callback coffeescript

我在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)
    )

1 个答案:

答案 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)
    )