2017-08-01 3 views
0

Ich habe eine Folge von Funktionsaufrufen, mit ES6 verbunden verspricht. Offensichtlich stimmt etwas nicht mit dieser Implementierung, da API-Aufrufe an den Endpunkt nichts zurückgeben und der Browser auf eine Antwort wartet.Problem mit Nodejs Versprechen

Bitte beraten.

module.exports.insertTreatmentDetails = function (req, res) { 
    var doctorId = 10000 
    var departmentId = 10000 
    var procedureid = 10000 
    var hospitalSchema = new hospitalModel(); 

    var p = new Promise(function (resolve, reject) { 
     counterSchema.getNext('Treatment.doctor.doctorId', collection, function (doctorId) { 
      doctorId = doctorId; 
     }) 
     counterSchema.getNext('Treatment.departmentId', collection, function (departmentId) { 
      departmentId = departmentId 
     }) 
     counterSchema.getNext('Treatment.procedureid', collection, function (procedureid) { 
      procedureid = procedureid 
     }) 
    }).then(function() { 
     setData() 
    }).then(function(){ 
     hospitalSchema.save(function (error, data) { 
      if (error) { 
       logger.error("Error while inserting record : - " + error) 
       return res.json({ "Message": error.message.split(":")[2].trim() }); 
      } 
      else { 
       return res.json({ "Message": "Data got inserted successfully" }); 
      } 
     }); 
    }); 
}; 
+0

Sie haben kein 'fangen' auf der Verheißung ... wenn dort irgendwo ein Fehler ist, würden Sie nie darüber erfahren. – jakerella

Antwort

0

Die kurze Antwort ist, dass Sie nicht resolve oder reject innerhalb der ersten Versprechen in der Kette fordern. Das Versprechen bleibt in einem pending Zustand. Mozilla hat eine gute basic explanation of promises.

Wie Fix

Es scheint, dass Sie doctorId, departmentId und procedureId vor dem Aufruf von setData abrufen möchten. Sie könnten versuchen, alle drei Aufrufe in einem Versprechen zu verpacken und zu überprüfen, ob alle drei bei jedem Callback etwas zurückgegeben haben, aber das Ideal ist es, ein Versprechen pro asynchroner Aufgabe zu haben.

Wenn es möglich ist, counterSchema.getNext zu ändern, können Sie diese Funktion eine Verheißung zurückgeben, anstatt einen Rückruf zu akzeptieren. Wenn nicht, würde ich empfehlen, jeden Anruf mit einem eigenen Versprechen zu versehen. Um zu halten die meisten wahr, was Ihr Code sieht derzeit wie, die wie folgt aussehen könnte:

var p = Promise.all([doctorPromise, departmentPromise, procedurePromise]) 
    .then(setData) 
    .then(/* ... */); 

Promises können Sie weitergeben müssen:

const doctorPromise = new Promise((resolve, reject) => 
    counterSchema.getNext('Treatment.doctor.doctorId', collection, id => { 
     doctorId = id; 
     resolve(); 
    })); 

Dann könnte man das erste Versprechen mit einem Aufruf an Promise.all ersetzen ein Wert bis zum nächsten Schritt, also wenn Sie Ihre breit angelegten Variablen loswerden wollten (oder sie in dem gleichen Schritt setzen, in dem Sie anrufen), könnten Sie einfach resolve als Rückruf an counterSchema.getNext übergeben und die Werte sammeln der nächste Schritt (auch wie Sie es machen würden, wenn Siehabengeben Sie ein Versprechen zurück:

Promise.all([/* ... */]) 
    .then(([doctorID, departmentID, procedureID]) => { 
     // If you aren't changing `setData` 
     doctorId = doctorID; 
     departmentId = departmentID; 
     procedureid = procedureID; 
     setData(); 
     // If you are changing `setData` 
     setData(doctorID, departmentID, procedureID); 
    }).then(/* ... */).catch(/* I would recommend adding error handling */); 
+0

Wie gebe ich einen Wert zum Antwortobjekt zurück? Sieht aus wie die Art, wie ich einen Wert an die Antwort zurückgebe obejct funktioniert nicht –

+0

'new Promise (function (resolve, reject) {' erstellt ein Versprechen. Die Funktion innerhalb hat zwei weitere Funktionen es kann aufrufen: "resolve" und "reject". Das Aufrufen von "resolve" löst das Versprechen auf, und das nächste ".then" wird erledigt. Der Aufruf von "reject" führt dazu, dass das Versprechen abgelehnt wird und der nächste ".catch" gefunden wird Sie haben nicht "Entschlossenheit" aufgerufen. –

+0

Vielen Dank für die brillante Erklärung Brett.Hope Dies wird vielen neuen Bienen helfen zu verstehen Versprechen –