10149440
各位午安,方才我在进行 node 上头的 MySQL query,发现了一些问题,请先见程式码如下。
var getAllCouponsInfoByManagerUidAndRange = function (uid, range, callback) {
// Select the special range in coupons, the range object have 'start' and 'amount'.
var sql_1 = "SELECT * FROM coupon WHERE coupon_id BETWEEN " + range.start + " AND " + (range.start + range.amount - 1);
dbclient.query(sql_1, function (err, coupons) {
// Fixed the properties.
coupons = TaskDateConvertToJson(coupons, new Array("create_time", "used_time"));
for (var i = 0 ; i < coupons.length ; i++) {
(function (j) {
// Get the employees' user info of having received coupons.
findUserByUid(coupons[j].uid, function (employee) {
// Get the managers of creating coupons.
findUserByUid(coupons[j].manager, function (manager) {
// Get the employees' task info of having received coupons.
findTaskByTid(coupons[j].tid, function (task) {
coupons[j]['employee'] = employee;
coupons[j]['manager'] = manager;
coupons[j]['task'] = task;
delete coupons[j]['uid'];
delete coupons[j]['tid'];
if (j == coupons.length - 1)
callback(coupons);
console.log(coupons[j]);
});
});
});
})(i);
}
});
}
其中有一行
console.log(coupons[j]);
是用来检查 query 的执行完毕顺序,
假使目前情况是 15 笔到 30 笔,因为部分条件不同,console.log 的结果会发现
15, 16, 18, 19, ... , 30, 17。
第 17 笔经过较多层的 query 所以回传的时间较久,因为这样:
if (j == coupons.length - 1)
callback(coupons);
在完成第 30 笔时就执行 callback ...其中回传的第 17 笔是没有 query 的结果。
还麻烦各位前辈协助解答,感谢!