Привет в нижеприведенной функции, когда я печатаю файл журнала, я мог видеть сообщения, отображаемые в следующем порядке, хотя обещание используется для синхронной связи.
Отображаемая последовательность -
a) "перед вызовом" b "после вызова" c "" внутри сохранения "d)" никаких проблем "
Что я могу изменить в коде, чтобы получить порядок журналов как 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 });
});
}
функция call-
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.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
});