[英]Issue with nodejs Promise sequence
嗨,在下面的功能中,当我打印日志文件时,尽管诺言用于同步通信,但我仍可以看到以下顺序显示的消息。
显示顺序-
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;
}
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"
只需返回您的承诺即可。
if (updateJustServiceDtls == 'true') { /* To update service details for the same vendor */
console.log("before call")
return updateJustServiceDetailsOnly(req, res)
console.log("after call")
}
在这种情况下,通话后显然不会被记录。 但是只需将日志移到下一个.then
。
当您处于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
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.