需求分析:根据一级标题ID筛选出所有对应的二级标题,返回一级标题ID,标题名和二级标题ID,标题名组成的数组
问题:通过forEach遍历所有一级标题取对应的ID,根据ID条件查找所有的二级标题,遍历符合条件的二级,取出二级标题的ID和标题名,此时,循环内部嵌套条件查找是个异步函数,resolve返回的结果为空。注:此处getSecondTitle为封装的读取数据库的异步函数
const allTitleId =function(firstTitleArray){
return new Promise(function(resolve,reject){
let secondArr=[],
secondObj={},
itemObj={},
dataArray=[];
//console.log(1)
firstTitleArray.forEach(function(item){
console.log(1)
getSecondTitle(item).then(function(ret){
// console.log(ret)
secondArr=[];
ret.forEach((item2)=>{
secondObj={};
secondObj['_id'] = String(item2._id);
secondObj['title'] = item2.title;
secondArr.push(secondObj)
//console.log(secondArr)
})
console.log(2)
itemObj = JSON.parse(JSON.stringify(item));
itemObj['secondTitle']= secondArr;
dataArray.push(itemObj)
}).catch(function(err){
reject(err)
})
})
console.log(3)
resolve(dataArray)
})
}
解决:javascript代码都是同步执行的,代码都在在一个代码“队列”里面。与此同时javascript还有一个“Event Queue”,事件队列里都是处理一些异步的callback/handler,处理ajax response,点击啊,文件,数据库操作结果。关键是,只有代码队列所有代码都执行完毕了,javascript才会从事件队列里取出一个callback/handler来执行。依赖于事件循环处理异步函数获取数据,会导致脚本事件执行顺序不正确,无法按需求获取数据。应采用递归方法处理异步函数获取数据。
const allTitleId =function(firstTitleArray){
return new Promise(function(resolve,reject){
let secondArr=[],
secondObj={},
itemObj={},
dataArray=[];
(function secondTitleloop(index){
getSecondTitle(firstTitleArray[index]).then(function(ret){
secondArr=[];
ret.forEach((item2)=>{
secondObj={};
secondObj['_id'] = String(item2._id);
secondObj['title'] = item2.title;
secondArr.push(secondObj)
})
itemObj = JSON.parse(JSON.stringify(firstTitleArray[index]));
itemObj['secondTitle']= secondArr;
dataArray.push(itemObj)
if (++index<firstTitleArray.length) {
secondTitleloop(index);
} else {
resolve(dataArray)
}
}).catch(function(err){
reject(err)
})
}
)(0)
})
}
来源:https://www.cnblogs.com/xuxiaoqiangAndHM/p/10766029.html