Promise链不在nodejs中执行

时间:2014-11-06 16:27:17

标签: node.js coffeescript

我有以下代码:

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

但在这种情况下,回复会立即执行,结果为空。知道我错过了什么/做错了吗?

2 个答案:

答案 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处理函数,以便将结果转发给当时返回的承诺。