2016-11-15 91 views
0

我有一个猫鼬查询,发现一堆场地,然后通过谷歌查询找到到这些场所的驾驶距离。 ,谷歌的功能是一个承诺内部和。然后我要做res.json venues.emitted.fulfill[0]否则JSON出现与如何从承诺中的函数返回新的json

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

    ] 
    }, 
    "ended": true 
} 

包裹有什么办法来避免返回所有自许,所以我可以做资源.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) 

回答

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

distancePromise功能不会因此返回承诺立即解决。 findDistance确实会返回一个以结果作为第一个参数解决的Promise。 这就是您看到“包裹”结果的属性。 中庸之道使用

return findDistance() 
.then(res.json) 

回到这一承诺将允许最后一个函数捕捉错误。

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)