2014-11-06 53 views
1
的NodeJS执行

我有以下代码:无极链不

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

如果答复被parseXML调用,您应该向我们展示该函数的代码 – 2014-11-06 16:40:13

+0

@RobertLevy reply是一个来自框架并传递给我的函数的函数,parseXML来自xml2js – 2014-11-06 16:49:13

回答

0

尝试使用Q.denodeify。

return Q.denodeify(parseXML)(response); 

您必须将结果承诺返回到then处理函数,以便将结果转发给由then返回的promise。

0

Acutally,当您创建承诺时,必须解决或拒绝承诺。所以一个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 
} 

在你的情况下,不要返回响应对象,而是通过解析它将它传递给下一个链。

+0

您的答案并不是真的有帮助,我不想使用'PROMISE',我必须使用Q库,'response'是一个XML,我该如何解决它。 – 2014-11-06 17:14:26