循环内部异步函数处理相关问题解析

  需求分析:根据一级标题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

时间: 2024-10-10 19:43:33

循环内部异步函数处理相关问题解析的相关文章

js的for循环中出现异步函数,回调引用的循环值总是最后一步的值?

这几天跟着视频学习node.js,碰到很多的异步函数的问题,现在将for循环中出现的异步函数回调值的问题总结如下: 具体问题是关于遍历文件夹中的子文件夹的,for循环包裹异步函数的代码: for (var i = 0; i < files.length; i++) { var itemFile = files[i]; fs.stat("./uploads/" + itemFile, function (err, stats) { if (stats.isDirectory())

js的for循环中出现异步函数,回调引用的循环值始终是最后的值

一.问题 今天工作中解决bug发现是由“for循环的异步函数,回调引用的循环值始终是最后的值”的现象导致的,如: for (var i = 0; i < files.length; i++) { var itemFile = files[i]; fs.stat("./uploads/" + itemFile, function (err, stats) { if (stats.isDirectory()) { console.log(itemFile+i); } else { c

Node.js的循环与异步问题

Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯 以后就会发现还是很简单的.然而这之中其实暗藏了不少陷阱,一个很容易遇到的问题就是 循环中的回调函数,初学者经常容易陷入这个圈套.让我们从一个例子开始说明这个问题. var fs = require('fs'); var files = ['a.txt', 'b.txt', 'c.txt']; for (var i = 0; i < files.length; i++) { fs.readFile(files[i

WPF异步回调时回调函数如何获取异步函数产生的变量

有这么一个问题,WPF在使用异步回调的时候,回调函数需要用到异步函数里产生的一个变量,例如异步函数里查询数据库得到了一个DataTable,如何传递给回调函数呢? [方案一]使用全局变量 很容易想到的是用全局变量,这也是最简单的办法.但是如果我想循环调用呢,例如回调函数判断异步函数执行完之后的DataTable有没有数据,有数据则继续异步(BeginInvoke),这时候如果使用全局变量可能会出现意外情况,因为是循环调用,回调函数使用的DataTable是不是你想要的那个值就比较难说了. [方案

JS中的循环结构、循环嵌套以及函数介绍

[循环结构的步骤]    *①声明循环变量    *②判断循环条件    *③执行循环体(while的{}中的所有代码)操作     *④更新循环变量    *     * 然后,循环执行②③④    *     *     * [JS中循环条件支持的数据类型]    * ①boolean:true 真     false   假    * ②string: 非空字符串为真       空字符串为假    * ③null/NaN/undefined:  全为假    * ④object:全为真 

获取JavaScript异步函数的返回值

今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> function getSomething() {  var r = 0;  setTimeout(function() {  r = 2;  }, 10);  return r; } function compute() {  var x = getSomething();  alert

ES2017异步函数现已正式可用

ES2017标准已于2017年6月份正式定稿了,并广泛支持最新的特性:异步函数.如果你曾经被异步 JavaScript 的逻辑困扰,这么新函数正是为你设计的. 异步函数或多或少会让你编写一些顺序的 JavaScript 代码,但是却不需要在 callbacks.generators 或 promise 中包含你的逻辑. 如下代码: function logger() {     let data = fetch('http://sampleapi.com/posts')     console.

js在for循环里边定义函数用到自增变量产生的问题

笔者最近做了很多的应聘笔试题,其中有一个让我印象特备深刻,关于在一个for循环里边些函数运用到for循环里边定义的变量的问题,废话不多说,先上代码,大家可以看看这段代码最后的结果是什么: var array=[];//定义一个数组,空的 for(var i=0;i<3;i++){     array[i]=function(){         alert(i);     } } array[0](); array[1](); array[2](); 初学者可能咋一看,想,这不是很简单吗?依次弹

JS中的循环嵌套 BOM函数

[嵌套循环特点]                           外层循环转一次,内层循环转一圈              外层循环控制行数,内层循环控制每行元素个数             [做图形题思路]              1确定图形一共几行  极为外层的循环的次数             2确定每行有几种元素,代表有几个内层循环.             3 确定每种元素的个数,即为每个内层循环的次数                 tips:通常:找出每种元素个数,与行号的关