如何从promise中的函数返回新的json

时间:2016-11-15 22:34:19

标签: javascript node.js mongoose coffeescript promise

我有一个mongoose查询,找到一堆场地,然后进行谷歌查询,找到到那些场地的行车距离。 google函数是在promise中,然后在.then中我必须执行res.json venues.emitted.fulfill[0],否则json会出现

  "emitter": {
    "domain": null,
    "_events": {
      "reject": [
        null,
        null
      ]
    },
    "_eventsCount": 2
  },
  "emitted": {
    "fulfill": [
      [... 
    ]
   ]

    ]
  },
  "ended": true
}

有没有办法避免从承诺中退回所有这些,所以我可以做res.json或这是最好的方法来解决这个问题?

以下是相关代码(coffeescript):

Venue.find {}
  .lean()
  .then (dbResponse) ->
    venues = dbResponse
    if req.param('hotelId')
      hotelId = req.param('hotelId')
      distancePromise = ()->
        venues = findDistances(hotelId, venues, req)
      Promise.resolve distancePromise()
      .then ()->
        res.json venues.emitted.fulfill[0]
    else
      res.json venues
  .catch (err) ->
    res.status(400).send(err)

2 个答案:

答案 0 :(得分:1)

您的distancePromise函数未返回Promise,因此立即解析。 findDistance确实返回一个Promise,它以结果作为第一个参数解析。 这就是你看到的属性"包装"结果。 Juste使用

return findDistance()
.then(res.json)

返回Promise将允许使用最后一个函数捕获错误。

Venue.find {}
  .lean()
  .then (dbResponse) ->
    venues = dbResponse
    if req.param('hotelId')
      hotelId = req.param('hotelId');
      return findDistances(hotelId, venues, req)
      .then (res.json)
    else
      return res.json venues
  .catch (err) ->
    res.status(400).send(err)

答案 1 :(得分:1)

当您调用返回承诺的函数时,您应该获得承诺返回给您的值,然后只发送该值。

Venue.find {}
  .lean()
  .then (dbResponse) ->
    venues = dbResponse
    if req.param('hotelId')
      hotelId = req.param('hotelId')          
      findDistances(hotelId, venues, req)
      .then (result)->
        res.json result
      .catch (error) ->
        res.status(404).send(err)
    else
      res.json venues
  .catch (err) ->
    res.status(400).send(err)