Вы немедленно resolve
вместо разрешения в обратном вызове, предоставленном mysqlConnect.query()
.
Рассмотрите сокращенную версию вашей getItemDetail
функции:
function getItemDetail(req, res) {
return new Promise(function(resolve, reject) {
var SQL = "mysql query";
mysqlConnect.query(SQL, function(err, result, fields) {
// Stuff
});
resolve('done');
});
}
Это логикаis:
- Создать новое обещание
- Начать
query
resolve()
- Как называется
getItemDetail
делает то, что долженпотому что getItemDetail
разрешено query
заканчивается через некоторое время
Вместо этого вы, вероятно, должны делать что-то вроде этого, где resolve
находится в пределах query
обратный вызов:
function getItemDetail(req, res) {
return new Promise(function(resolve, reject) {
var SQL = "mysql query";
mysqlConnect.query(SQL, function(err, result, fields) {
// Stuff
resolve('done');
});
});
}
Логика здесь:
- Создать новое обещание
- Начать
query
getItemDetail
вызывающийне должен ничего делать, потому что getItemDetail
еще не решено query
завершается в какой-то момент, и вызывается обратный вызов, который вызывает resolve
getItemDetail
, вызывающий абонент теперьпродолжить, так как было сказано, что функция разрешена
Вы должны следовать этой схеме в любой функции, где вам нужен запросчтобы действительно закончить, прежде чем звонящий должен двигаться дальше.
Вы также должны рассмотреть возможность использования async/await
.Рассмотрим этот сокращенный пример, используя ваш код в качестве основы:
const mysqlConnect = {
query(sql, cb) {
setTimeout(() => {
cb(null, ["foo"], ["bar"]);
});
}
};
(async function() {
const t = await calculateGstBaseOnInput({
body: {
so_items: ["a", "b", "c"]
}
});
}());
async function calculateGstBaseOnInput(req, res) {
for (var item of req.body.so_items) {
const itemDetail = await getItemDetail(req, res);
const cartItems = await getCartItems(req, res);
const gst = await calculateGST(req, res);
}
}
function getItemDetail(req, res) {
console.log("getItemDetail");
return new Promise(function(resolve, reject) {
var SQL = "mysql query";
mysqlConnect.query(SQL, function(err, result, fields) {
// Stuff
resolve('done');
});
});
}
function getCartItems(req, res) {
return new Promise(function(resolve, reject) {
console.log("---getCartItems");
var SQL = "mysql query";
mysqlConnect.query(SQL, function(err, result, fields) {
// Stuff
resolve('done');
});
});
}
function calculateGST(req, res) {
return new Promise(function(resolve, reject) {
console.log("------calculateGST");
// Stuff
resolve('done');
});
}
Это выводит:
getItemDetail
---getCartItems
------calculateGST
getItemDetail
---getCartItems
------calculateGST
getItemDetail
---getCartItems
------calculateGST