我有以下代码:
Q.fcall(->
response = req.post({url:url, formData: formData})
return response
).then((response) ->
reply(response)
)
它发出请求,当服务器响应执行reply
函数时,直到这里一切正常。响应采用XML格式:
<?xml version='1.0' encoding='UTF-8'?>
<foxydata>
<store_version>2.0</store_version>
<result>SUCCESS</result>
<messages>
<message>Transaction Found</message>
</messages>
<transaction>
...
...
...
我想使用节点模块(xml2js)来转换它。所以我这样做了:
add = (request, reply) ->
Q.fcall(->
response = req.post({url:url, formData: formData})
return response
).then((response) ->
parseXML(response, (err, result) ->
reply(result)
)
)
但在这种情况下,回复会立即执行,结果为空。知道我错过了什么/做错了吗?
答案 0 :(得分:0)
实际上,当您创建承诺时,必须解决或拒绝承诺。所以promise函数会解决,拒绝回调。
dothis
.then(dothat, error)
.then(dothattoo)
.catch(error)
dothis = do(params);
do = function(params) {
return PROMISE(function(resolve, reject) {
// use params here as variables
// do something with params
if(params) {
resolve(response)
} else {
reject("some error")
}
};
}
error = function(err) {
// handle that err
}
在您的情况下,不要返回响应对象,而是通过解析它将其传递给下一个链。
答案 1 :(得分:0)
尝试使用Q.denodeify。
return Q.denodeify(parseXML)(response);
您必须将结果承诺返回到then处理函数,以便将结果转发给当时返回的承诺。