记录nodejs实际使用问题。
需求描述:
使用nodejs开发后台,对同一个表的同一个字段会有多次循环连续的查询和修改操作。
//data 是个数组集合
data.foreach(function (item) {
//1.查询a表的content字段
//2.修改a表的content字段
})
开发中出现的问题:最开始只是使用了waterfall来控制查询和更新操作保证是顺序执行的。外层的循环用的普通for循环和foreach循环,但是for循环和foreach在node中是异步的执行的,并不能保证在每次的循环中都是先执行查询,再更新数据操作后执行下一次循环。所以采用了async模块的eachSeries(coll,iteratee,callback)保证循环的顺序执行。
async.eachSeries(coll,iteratee,callback)
coll:可以是一个数组或一个对象(用来遍历)。
iteratee:是每次遍历执行的函数。
callback:是回调函数,当遍历中出错会立刻执行回调函数并返回错误信息,若没有发生错误则会等遍历结束后将正确的结果返回。
至于waterfall就不赘述了,使用node开发的估计都避免不了它。这里主要是使用eachSeries使循环顺序执行,保证了内部sql的执行顺序。
相关的主要代码:
function deleteChp(chpId, code,pageId,contentDelId, callBack) {
Async.waterfall(
[
function (cb) {
let pageIds = "select a.`page_id` as pageId,a.`content_id` as contentId from `m_chapter` a where a.ch_id = ? Or a.parent_code like ? and a.del = ? ";
let paramsPg = [chpId,code + '%',0];
query.exec(pageIds,paramsPg,function (err,dataPageIds) {
if (err){
log.error(err);
callBack(err);
}else {
cb(null,dataPageIds);
}
});
},
//这块是控制同步循环的部分,也就是本篇内容主要记录的问题
function (dataPageIds,cb) {
let count = 0;
let len = dataPageIds.length;
if (len > 0){
Async.eachSeries(dataPageIds,function (item, cbx) {//使用eachSeries控制顺序循环
let params = [];
let pageId = item.pageId;
let contentId = item.contentId;
Async.waterfall([ //使用waterfall来控制查询和更新数据的操作顺序执行
function (cb2) {
let sql = "select a.modify_content as content from s_pages a where a.sp_id = ? and a.del = ?";
params = [pageId,0];
query.exec(sql,params,function (err,data) {
if (err){
log.error(err);
callBack(err);
}else {
cb2(null,data);
}
});
},
function (data,cb2) {
let results = data;
if (results.length > 0){
let content = deleteSmark(results[0],contentId);
let pm = [];
//修改smark内容
let str = " UPDATE `s_pages` SET modify_content = ? WHERE sp_id = ? and del = ? ";
pm.push(content);
pm.push(pageId);
pm.push(0);
query.exec(str,pm,function (err) {
if (err){
log.error(err);
callBack(err);
}
count++;
if (count == dataPageIds.length){
cb2(null,1);
} else {
cbx(null);
}
});
}else {
cb2(null,0)
}
}
],function (err,res) {
if (err){
log.error(err);
callBack(err);
}
cb(null,res);
});
});
}else {
cb(null,0);
}
},
function (datas,cb) {
let str, queryParams;
str = " UPDATE `m_chapter` mkp SET del= ? WHERE mkp.ch_id = ? Or mkp.parent_code like ? ";
queryParams = [1, chpId, code + '%'];
query.exec(str,queryParams,function (err) {
if (err){
log.error(err);
callBack(err);
}
cb(null, 2);
});
}
],function (err) {
if (err){
log.error(err);
callBack(err);
}
callBack(0);
}
);
}
我相信慢慢一点点的进步,一定会量变到质变,凡事你不理解的,都是你的认知没有达到一定的水平。