SQL查询与每个asynchronous

我的问题是当我得到用户数组,并尝试运行asynchronous每个启动每个sqlRequest,而不是一个一个地推入数组。

它应该做1 sqlRequest 1,而不是由每个用户sqlRequest和数组推动。

这里是一个asynchronous每个

function getUserFavCat(params, callback) { var usersArrayCat = []; async.each(params, function (user, cb) { sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) { if (!result) { //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) } else if (result.length == 0) { //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) } else { user.favouriteCat = utils.takeMostRepeatingObj(result); usersArrayCat.push(user); } cb(); }) }, function() { callback(null, usersArrayCat) }); }; 

这是SQL查询:

 function sqlRequest (sqlQuery, callback) { var connection = new sql.Connection(sql_conf, function (err) { if (err){ console.log(err) } else { var request = new sql.Request(connection); request.query(sqlQuery, function(err, result) { console.log(result) if(err){ console.error(err) } else if(!result){ console.error("NO RESPONSE SQL QUERY") } else { callback(null, result); connection.close(); } }) } }); connection.on('error', function(err) { console.log(err); }); }; 

使用async.eachLimit来限制no。 的要求

 function getUserFavCat(params, callback) { var usersArrayCat = []; console.log(`length of array ${params.length}`) // 1 here means 1 request at a time async.eachLimit(params, 1, function (user, cb) { sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) { if (!result) { //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) } else if (result.length == 0) { //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) } else { user.favouriteCat = utils.takeMostRepeatingObj(result); usersArrayCat.push(user); cb(); } }) }, function (err) { if (err) return callback(err); callback(null, usersArrayCat) }); }; 

通过使用async.map尝试这个技巧,并推动每个callback到一个数组。 然后,您可以使用async.parallel过滤出成功用户的callback结果,并将其推送到usersArrayCat数组

 function getUserFavCat(params, callback) { var usersArrayCat = [], callbackArrays = []; async.map(params, function (user, cb) { callbackArrays.push(function (cb) { sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) { if (!result) { user.status = '99'; // error status cb(null, user); } else if (result.length == 0) { user.status = '99'; // error status cb(null, user); } else { user.favouriteCat = utils.takeMostRepeatingObj(result); user.status = '00'; //success status cb(null, user); } }); }, function(err, results) { // comes here after all individual async calls have completed // check errors; array of results is in data cb(null, results) }); async.parallel(callbackArrays, function (err, results) { results.forEach (function (elem, ind) { if (elem.status == '00') { usersArrayCat.push(elem); } }); }); };