我有一个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)
答案 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)