node中循环异步的问题[‘解决方案‘]_源于map循环和for循环对异步事件配合async、await的支持

简介: 本文探讨了在Node.js中处理循环异步操作的问题,比较了使用map和for循环结合async/await处理异步事件的差异,并提供了解决方案。

首县,我先说一下我这个虚拟的需求,我从数据库中查找所有用户的信息,包括省市县,但是我存储的时候是以省码、市码、县码code的形式来存储到数据库的,所有我取出来的时候还需要去数据库省市县表中查找对应的name,所有产生了这个问题。

刚开始的思路很直接,很明确,就是找到所有人数据之后,进行循环,插入新属性,返回数据给前端。

//所有 user 用户信息
router.get('/queryAllUserInfo', async function (req, res, next) {
   
    let data = await Db.DBFunPro(`select user_info.uuid,user_info.name,user_info.sex,user_info.tel,user_info.pro,user_info.city,user_info.area,user.username,user.password,user_info.fileUrl from  user_info, user  where user.uuid = user_info.uuid`)
    let forFun = async (item) => {
   
        let prostr = await Db.DBFunPro(`select pro_name from pros where pro_id='${
     item.pro}'`)
        let citystr = await Db.DBFunPro(`select city_name from cities where city_id='${
     item.city}'`)
        let areastr = await Db.DBFunPro(`select area_name from areas where area_id='${
     item.area}'`)
        return prostr[0].pro_name + citystr[0].city_name + areastr[0].area_name
    }
    data.map(async item=>{
   
     let codeStr =  await  forFun(item)
        item.codeStr = codeStr
         console.log(item,'item');
    })
    res.send(endMassage(data))
});

上面的代码并不能解决问题,并没有将字段codeStr加上,但是在node端能打印到已经加上了,看下面两个图:
在这里插入图片描述
这是前端截图,发现并没有codeStr字段,但是:
在这里插入图片描述
node端打印是能获取到值的。发生了异步事件。

分割线==========================================================

分析:

在返回之后,map循环中的forFun才执行完,map循环的参数一个函数,map循环完一次调用多个函数,每一个函数的第一个参数item就是数组的每一项,map只管执行回调函数item=>{},只要这个执行完,就算执行完,并不管你这个函数里面是否是异步,所以,并不能通过async await的形式控制map循环。

当然,我们换一种形式,我们将循环放到函数里面 ,控制函数异步

//所有 user 用户信息
router.get('/queryAllUserInfo', async function (req, res, next) {
   
    let data = await Db.DBFunPro(`select user_info.uuid,user_info.name,user_info.sex,user_info.tel,user_info.pro,user_info.city,user_info.area,user.username,user.password,user_info.fileUrl from  user_info, user  where user.uuid = user_info.uuid`)
    let forFun = async (item) => {
   
        let prostr = await Db.DBFunPro(`select pro_name from pros where pro_id='${
     item.pro}'`)
        let citystr = await Db.DBFunPro(`select city_name from cities where city_id='${
     item.city}'`)
        let areastr = await Db.DBFunPro(`select area_name from areas where area_id='${
     item.area}'`)
        return prostr[0].pro_name + citystr[0].city_name + areastr[0].area_name
    }
    let datap = async () => {
   
        //map加不上
         data.map(async item => {
   
            let codeStr = await forFun(item)
            item.codeStr = codeStr
            console.log(item,'item');
        })
        return data
    }
    let datap2 = await datap()
    res.send(endMassage(datap2))
});

同样的,这也不行,原因和上面一样。

分割线==========================================================

下面我们不适用map来实现一下,我们使用for:

//所有 user 用户信息
router.get('/queryAllUserInfo', async function (req, res, next) {
   
    let data = await Db.DBFunPro(`select user_info.uuid,user_info.name,user_info.sex,user_info.tel,user_info.pro,user_info.city,user_info.area,user.username,user.password,user_info.fileUrl from  user_info, user  where user.uuid = user_info.uuid`)
    let forFun = async (item) => {
   
        let prostr = await Db.DBFunPro(`select pro_name from pros where pro_id='${
     item.pro}'`)
        let citystr = await Db.DBFunPro(`select city_name from cities where city_id='${
     item.city}'`)
        let areastr = await Db.DBFunPro(`select area_name from areas where area_id='${
     item.area}'`)
        return prostr[0].pro_name + citystr[0].city_name + areastr[0].area_name
    }
    //for可以加上
    for (let index = 0; index < data.length; index++) {
   
        let codeStr = await forFun(data[index])
        data[index].codeStr = codeStr
        console.log(data[index], 'data[index]');
    }
    res.send(endMassage(data))
});

在这里插入图片描述
在这里插入图片描述
很直接的完成了我们的需求,这源于for循环的机制流程:
在这里插入图片描述
首先判断1这个条件,执行2中的代码块,只有执行将await执行完,在执行3,以此循环。

目录
相关文章
|
12月前
|
JavaScript
node环境之Error: Cannot find module ‘chalk’ 报错无法解决的问题—-网上说让你npm install chalk 基本是没有用的-优雅草央千澈解决方案
node环境之Error: Cannot find module ‘chalk’ 报错无法解决的问题—-网上说让你npm install chalk 基本是没有用的-优雅草央千澈解决方案
778 13
node环境之Error: Cannot find module ‘chalk’ 报错无法解决的问题—-网上说让你npm install chalk 基本是没有用的-优雅草央千澈解决方案
|
11月前
|
JavaScript
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
1640 27
|
JavaScript 前端开发 开发者
掌握Node.js中的异步编程:从回调到async/await
Node.js的异步编程模型是其核心特性之一,它使得开发者能够构建高性能和高并发的应用程序。本文将带你从Node.js的异步编程基础开始,逐步深入到回调函数、Promises、以及最新的async/await语法。我们将探讨这些异步模式的原理、使用场景和最佳实践,并通过实例代码展示如何在实际项目中应用这些概念。
|
数据采集 JavaScript 前端开发
NodeJS技巧:在循环中管理异步函数的执行次数
在Node.js网络爬虫开发中,管理异步函数执行次数是关键。利用Promise.all、async/await或async库能优雅地控制并发。示例展示如何用async/await配合代理IP抓取数据,避免触发反爬策略。在循环中,每个异步请求只执行一次,保证请求有序进行,提高爬虫的稳定性和效率。通过正确的方法,可以有效应对网络爬虫的挑战。
148 7
NodeJS技巧:在循环中管理异步函数的执行次数
|
存储 JavaScript API
Node.js中的异步API
【8月更文挑战第16天】
151 1
|
5月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
1095 11
|
10月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
9月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
7568 23
|
10月前
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
561 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
10月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!