循环内部异步函数处理相关问题解析
Posted xuxiaoqiangandhm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环内部异步函数处理相关问题解析相关的知识,希望对你有一定的参考价值。
需求分析:根据一级标题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) }) }
以上是关于循环内部异步函数处理相关问题解析的主要内容,如果未能解决你的问题,请参考以下文章
当循环在异步函数内部而不是相反时,为啥 Async/Await 可以正常工作?