2017-09-21 15 views
1

こんにちは、ログファイルを印刷すると、同期通信に約束が使用されていますが、以下のメッセージが表示されます。Issue with nodejs Promise sequence

表示順序 - "内部保存" D)

a)の "呼び出しの前に" B C "コールの後に")私が取得するためのコードで何が変わるん

"問題なく" below-

a)の "呼び出しの前に" b)は、 "内部の保存"

"コールの後に" C) "問題なく" D)として、ログの順序

コントローラー・コード -

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

機能

var updateJustServiceDetailsOnly = function (req, res) { 

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

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

答えて

0

どうcall- after callについて、それが唯一updateJustServiceDetailsOnlyの結果を記録し、返却された場合、あなたはそれを省略することができます。

updateJustServiceDetailsOnlyの約束が決済されるときに、次の実行を渡すために強制されますリターン。しかし、その行の後にはコードは機能しません。希望の結果が必要な場合は、返品後に部品を取り外す必要があります。このコードでは

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

結果は、ちょうどあなたの約束を返す

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

になります。

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

この場合、コール後は明らかにログに記録されません。しかし、ログを次の.thenに移動してください。

プロミスチェーンにいるときに、もう1つのプロミスがあり、それを待っていたい場合は、それを返すだけです。

例:

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