问题与nodejs承诺序列

嗨在下面的function,当我打印日志文件我可以看到消息显示在下面的顺序,虽然承诺用于同步通信。

显示的序列 –

a)“呼叫前”b“呼叫后”c)“内部保存”d)“没有问题”

我在代码中更改什么以获取日志的顺序如下所示 –

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

接下来怎么样,如果只是日志,可以忽略它,并返回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" 

只要回到你的诺言。

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

在这种情况下显然在通话后不会被logging。 但是,只要移动下一个日志。

当你在Promise链中时,如果你有另一个Promise来做,而你想等待它,就把它返回。

例:

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