如何使用返回值返回promise

时间:2017-10-08 18:01:13

标签: javascript node.js promise

getAccomodationCost是一个函数,它应该返回一个带有返回值的promise。现在它没有定义错误解决方法。

然后在promise内的行解析(JSON.parse(JSON.stringify(result)))中抛出此错误消息。如果我用return返回关键字resolve,则main函数中的Promise.all调用将失败。

有人可以帮我从下面的函数返回一个带有返回值JSON.parse(JSON.stringify(result))的promise。

  var getAccomodationCost = function (req, res) {

       var accomodationCostPromise = new Promise(function (resolve, reject) 
        {
        getHospitalStayDuration(req, res, function (duration) {
            resolve(duration)            
        })
     })
    .then(function (duration) {
        hotelModel.aggregate([
           //Some logic here
        ], function (err, result) {            
           resolve(JSON.parse(JSON.stringify(result)))          
        })

   })
   return accomodationCostPromise;
}

   //Main function where the above snippet is called   
    const promise1 = somefunction(req, res);
    const accomodationCostPromise = getAccomodationCost(req, res)   
    Promise.all([promise1,accomodationCostPromise])
    .then(([hospitalInfo,accomodationCost]) => {        
        //Return some json response from here
    }).catch(function (err) {
        return res.json({ "Message": err.message });
    });    

2 个答案:

答案 0 :(得分:2)

如果可能,hotelModel.aggregate会返回一个承诺。这使得代码看起来像这样:

.then(function (duration) {
    return hotelModel.aggregate([
       //Some logic here
    ]).then(result => JSON.parse(JSON.stringify(result))) // Not sure why you're stringify/parsing
 })

如果您无法修改hotelModel.aggregate以返回承诺,则需要创建另一个承诺并从.then(function (duration)返回该承诺,类似于您对getHospitalStayDuration的承诺。

答案 1 :(得分:-2)

Promise只能履行一次。 resolve()在函数内被调用两次,resolve未在.then()中定义。 resolvePromise构造函数执行函数中定义。应在Promise内使用第二个.then()

var getAccomodationCost = function (req, res) {
  return new Promise(function (resolve, reject) {
        getHospitalStayDuration(req, res, function (duration) {
            resolve(duration)            
        })
     })
    .then(function (duration) {
       return new Promise(function(resolve, reject) {
         hotelModel.aggregate([
           //Some logic here
         ], function (err, result) {  
           if (err) reject(err);          
           resolve(JSON.parse(JSON.stringify(result)))          
         })
       })
     });
}