有一个轮询SOAP端点的函数
someFunction = (task={}, callback)->
req = {}
req.body = buildEnvelope(task) # this works correctly
result = {}
request.post(
{url: <<wsdl string>>, body: req.body, headers: {"Content-Type": "text/xml"}},
(error, response, body) ->
if not error and response.statusCode is 200
result = buildHash(body) # this builds a hash from the result, correctly
return result
)
所有内部函数都按预期工作,但是当我尝试做console.log(someFunction(hash, ()->)
之类的事情时,我得到奇怪的内容:
{ domain: null,
_events: { error: [Function], complete: [Function], pipe: [Function] },
_maxListeners: 10,
readable: true,
writable: true,
body: <Buffer 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 55 54 46 2d 38 22 3f 3e 20 3c 53 4f 41 50 2d 45 4e 56 3a 45 6e ...>,
headers:
{ 'Content-Type': 'text/xml',...}
看起来像是从request
返回的某种味道的流对象。我猜这是因为我把return
语句放在request.post()
调用的中间,但是如果我把它放在那个调用之外,它返回一个空哈希,因为返回发生在POST操作发生之前。
获得我期望的哈希值的最佳方法是什么,因为运行someFunction()
将由函数返回?
返回值是request.post
返回的值。如果CoffeeScript函数没有显式的return
语句,那么它返回最后执行语句的值;在您的情况下,这将是request.post
调用。
可能没有人关心你的request.post
回调返回什么,所以你的:
return result
是毫无意义的。如果你想从异步调用中获得一些东西,然后你需要使用callback
参数:
someFunction = (task={}, callback)->
#...
request.post(
{url: <<wsdl string>>, body: req.body, headers: {"Content-Type": "text/xml"}},
(error, response, body) ->
if not error and response.statusCode is 200
callback(buildHash(body)) # <------------------
)
someFunction({...}, (hash) ->
# Do something interesting with `hash` in here...
)
callback
的真正调用约定当然取决于您需要返回的具体内容。