2017-09-21 3 views
1

Hallo in der unten stehenden Funktion, wenn ich die Protokolldatei drucken, konnte ich die Nachrichten in der folgenden Reihenfolge angezeigt, obwohl Versprechen für synchrone Kommunikation verwendet wird.Problem mit nodejs Promise-Sequenz

angezeigt Sequenz -

a) "vor Aufruf" b "nach dem Aufruf" c) "inside save" d) "keine Probleme"

Was bekommen kann ich im Code ändern die Reihenfolge der Protokolle als unten-

a) "vor dem Aufruf" b) "nach dem Aufruf" c) "ohne Probleme" d) "inside Speicher"

Controller-Code -

module.exports.updateLocalTransportVendorDtls = function (req, res) { 

    var transportSchema = new transportModel(); 

    new Promise(function (resolve, reject) { 

     checkForNewVehicleType(req, function (doc) { 
      resolve(doc) 
     }) 
    }) 
    .then(function (doc) { 

     var updateJustServiceDtls = doc.split(/\|/)[2]; 
     var updateVehicle = doc.split(/\|/)[0]; 
     var addVehicle = doc.split(/\|/)[1]; 

     if (updateJustServiceDtls == 'true') { /* To update service details for the same vendor */ 
      console.log("before call") 
      updateJustServiceDetailsOnly(req, res) 
      console.log("after call")   
     } 

    }).then(function() { 
     console.log("inside save") 
     transportSchema.save(function (error) { 
      if (error) {    
       return res.status(500).json({ "Message": error.message.trim() }); 
      } 
      else { 
       return res.json({ "Message": "Data got inserted successfully in local_transport_details collection" }); 
      } 
     }) 

    }).catch(function (err) { 
     return res.json({ "Message": err.message }); 
    }); 
} 

Funktion Call-

var updateJustServiceDetailsOnly = function (req, res) { 

    var promise = new Promise(function (resolve, reject) { 

       //code to update db 
       console.log("no issues") 
       resolve(); 
      }); 
    }) 
    return promise; 
} 

Antwort

0

Was after call, können Sie es weglassen kann, wenn es nur einzuloggen und das Ergebnis der updateJustServiceDetailsOnly zurückzukehren.

Die Rückkehr wird gezwungen, die Ausführung an die nächste zu übergeben, wenn die updateJustServiceDetailsOnly Versprechen verrechnet werden. Aber nach dieser Zeile wird kein Code mehr funktionieren. Wenn Sie das gewünschte Ergebnis wünschen, müssen Sie das Teil nach der Rückkehr entfernen.

if (updateJustServiceDtls == 'true') { 
    console.log("before call") 
    return updateJustServiceDetailsOnly(req, res) 
    // console.log("after call") this will not be called 
} 

Mit diesem Code wird das Ergebnis

a)"before call" b)"no issues" c)"inside save" 
0

Sie Ihre Versprechen zurückkehren.

if (updateJustServiceDtls == 'true') { /* To update service details for the same vendor */ 
     console.log("before call") 
     return updateJustServiceDetailsOnly(req, res) 
     console.log("after call")   
} 

In diesem Fall wird offensichtlich nach Anruf nicht protokolliert werden. Aber verschiebe einfach das Log in den nächsten .then.

Wenn Sie in der Promise-Kette sind, wenn Sie ein anderes Versprechen haben und Sie darauf warten möchten, geben Sie es einfach zurück.

Beispiel:

Promise.resolve() 
.then(() => { 
    // I have an async to do, I return it to wait for it 
    return Promise.resolve('after call'); 
}) 
.then((result) => { 
    // it will be called only when the Promise returned in the previous chain will resolve 
    // the result is the data passed in the resolution of your promise 
    console.log(result); // after call 
});