如何从承诺中的函数 return new json

How to return new json from a function within a promise

我有一个 mongoose 查询,可以找到一堆场地,然后执行 google 查询来查找到这些场地的行驶距离。 google 函数在一个 promise 中,然后我必须做 res.json venues.emitted.fulfill[0] 否则 json 会被

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

    ]
  },
  "ended": true
}

有什么方法可以避免从 promise 中返回所有内容,这样我就可以做 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)

您的 distancePromise 函数不 return Promise 因此会立即解析。 findDistance 执行 return 一个 Promise,该 Promise 将结果作为第一个参数解析。 这就是您所看到的 "wrapping" 结果的属性。 只需使用

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)

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

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)