2017-10-08 1 views
-1

getAccomodationCost ist eine Funktion, von der erwartet wird, dass sie ein Versprechen mit einem Rückgabewert zurückgibt. Jetzt wirft es einen Fehler, die Auflösung ist nicht definiert.So geben Sie ein Versprechen mit einem Rückgabewert zurück

Diese Fehlermeldung wird bei Zeilenauflösung (JSON.parse (JSON.stringify (Ergebnis))) innerhalb Versprechen dann ausgelöst. Wenn ich das Schlüsselwort resolve mit return ersetze, wird der Promise.all-Aufruf in der Hauptfunktion fehlschlagen.

Kann mir jemand helfen, ein Versprechen mit einem Rückgabewert JSON.parse (JSON.stringify (result)) von der folgenden Funktion zurückzugeben.

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 }); 
    });  
+0

Zuerst müssen Sie wahrscheinlich hotelModel.aggregate() zurückgeben (und nicht nur aufrufen). Zweitens weiß ich nichts über Ihre Aggregatfunktion, aber von dem, was ich sehen kann, gibt es keine Auflösungsmethode, die in der übergebenen Funktion erreichbar ist. Denken Sie daran, dass Sie das Ergebnis immer zurückgeben müssen, damit Sie Versprechen verketten können. – sjahan

+0

Sie müssen ein zweites "neues Versprechen" erstellen, um eine "Lösung" für das Callback "hotelModel.aggregate" zu erhalten. – Bergi

Antwort

-2

Ein Promise kann nur einmal erfüllt werden. resolve() wird innerhalb der Funktion zweimal aufgerufen, resolve ist nicht innerhalb definiert. resolve ist innerhalb Promise Konstruktor Executor-Funktion definiert. Eine zweite Promise sollte innerhalb .then() verwendet werden.

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)))   
     }) 
     }) 
    }); 
} 
+0

Gibt es eine Möglichkeit, accommodationCostPromise mit einem Rückgabewert von getAccomodationCost zurückzugeben? –

2

Wenn möglich haben hotelModel.aggregate ein Versprechen zurückgeben. Das würde den Code in etwa so aussehen machen:

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

Wenn Sie nicht hotelModel.aggregate ändern können ein Versprechen zurückzukehren, müssen Sie ein anderes Versprechen erstellen und zurückzugeben, von .then(function (duration), ähnlich wie Sie tut es für getHospitalStayDuration.

Verwandte Themen