首页 > 数据库 >nodejs处理一段redis获取集合,数组的代码优化(其中包含:es6同步返回数据的处理,new Promise)

nodejs处理一段redis获取集合,数组的代码优化(其中包含:es6同步返回数据的处理,new Promise)

时间:2023-03-21 14:24:33浏览次数:54  
标签:es6 return err nodejs res shangxing 代码优化 data businfo

从异步,用延时来处理,改成同步获取数据
获取数据主要分2步:
1.从redis集合中获取数组;
2.遍历数组,抓取其中字符串,解析,拼接成需要的数据,返回给前端

原代码,用sleep方法,避免异步数据处理带来的提前返回数据的问题;

  • (缺点:时间比较久,逻辑中是有问题的)
// 获取线路上公交的位置信息
app.post("/bus/getLineBusPos",async (req,res)=>{
    const { lineCode } = req.body;
    if(!lineCode){
        res.send({ret: 101, msg: '缺少线路参数'})
        return;
    }

    let data = await getredisdata(lineCode);
    await sleep(888); // 休眠 2 秒
    res.send({ret: 0, msg: '获取成功',data})
    return;
})

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}


const getredisdata = async(lineCode) => {
     let shangxing = [],
         xiaxing = [];
     redisclient.smembers('xzspj_line_' + lineCode, (err, bus_arr) => {
         console.log('-------all,sets,bus_arr----------');
         console.log(bus_arr); // 输出集合中的所有元素
         bus_arr.forEach((item) => {
             //console.log(item)
             redisclient.get('xzspj_bus_' + item, function(err, res){
                 let businfo = JSON.parse(res);
                 console.log("get bus callback:" , businfo)
                 if(businfo){
                     //从主站开往副站为下行,从副站开往主站为上行
                     if(businfo.status == 0 || businfo.status == 4){
                         console.log('--shangxing');
                         shangxing.push(businfo)
                     }

                     if(businfo.status == 2 || businfo.status == 3){
                         xiaxing.push(businfo)
                     }
                 }
             });
         })
     });

     let data = {};
     data.shangxing = shangxing;
     data.xiaxing = xiaxing;
     return data;
} 

优化后的代码

  • 封装2个new Promise返回的方法
  • for(const i of arr) 循环中才可以用 await,类似:forEach,each,map循环中不好放await
// 获取集合内容
function getSetContents(setName) {
    return new Promise((resolve, reject) => {
        // 以同步方式获取集合内容
        redisclient.smembers(setName, (err, members) => {
            if (err) {
                reject(err);
            } else {
                resolve(members);
            }
        });
    });
}

// 获取字符串内容
function getStrContents(strName) {
    return new Promise((resolve, reject) => {
        // 以同步方式获取集合内容
        redisclient.get(strName, (err, res) => {
            if (err) {
                reject(err);
            } else {
                resolve(res);
            }
        });
    });
}


const getredisdata = async(lineCode) => {
    let shangxing = [],
        xiaxing = [];

    try {
        const members = await getSetContents('xzspj_line_' + lineCode);
        console.log('members',members);
        for(const item of members){
            try {
                let res = await getStrContents('xzspj_bus_' + item);
                let businfo = JSON.parse(res);
                console.log("get bus callback:" , businfo)
                if(businfo){
                    //从主站开往副站为下行,从副站开往主站为上行
                    if(businfo.status == 0 || businfo.status == 4){
                        //console.log('--shangxing');
                        shangxing.push(businfo)
                    }
    
                    if(businfo.status == 2 || businfo.status == 3){
                        xiaxing.push(businfo)
                    }
                }
            } catch(err){
                console.log('err2-->',err);
            }
        }

        let data = {};
        data.shangxing = shangxing;
        data.xiaxing = xiaxing;
        return data;
    } catch(err){
        console.log('err1---->',err);
    } finally{

    }
    return;
} 


// 获取线路上公交的位置信息
app.post("/bus/getLineBusPos",async (req,res)=>{
    const { lineCode } = req.body;
    if(!lineCode){
        res.send({ret: 101, msg: '缺少线路参数'})
        return;
    }

    let data = await getredisdata(lineCode);
    //await sleep(888); // 休眠 2 秒----不用了
    res.send({ret: 0, msg: '获取成功',data})
    return;
})

标签:es6,return,err,nodejs,res,shangxing,代码优化,data,businfo
From: https://www.cnblogs.com/pansidong/p/17239858.html

相关文章

  • nodejs获取redis集合内容,同步方法
    可以使用redis模块来连接和操作Redis数据库。以下是使用该模块获取Redis集合内容的同步方法://引入redis模块constredis=require('redis');//创建redis客户端const......
  • 什么是webpack、npm、node、nodejs?他们之间有什么区别?
     最近在学一学前端的东西,发现前端技术栈有几个概念有些分不清,比如接触Vue后,对Vue-Cli有了解后,仅仅知道Vue-Cli是一个Vue项目的脚手架,可以快速的构建一个Vue的基于Npm的模......
  • 分享几个工作中实用的代码优化技巧!
    前言之前分享一篇代码优化的文章:条件语句的多层嵌套问题优化,助你写出不让同事吐槽的代码!今天再次分享一些我日常工作中常用的代码优化技巧,希望对大家有帮助!文章首发在公......
  • Unbuntu22.04使用NVM安装NodeJS
    一、使用NVM(NodeVersionManager)1.在NVMgithub上的readme获取一行命令curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh|bash或wge......
  • 3. ES6 语法
    ES6语法1块作用域构造let和const1.1块作用域块级声明用于生命在指定快的作用域之外无法访问的变量。块级作用域存在于:函数内部块中(大括号之间的区域)1.2let......
  • nodejs 操作redis的集合操作
    constredis=require('redis');constclient=redis.createClient();//向集合中添加元素client.sadd('myset','foo','bar','baz',(err,result)=>{cons......
  • Nodejs
    Nodejs-Web336global.process.mainModule.constructor._load('child_process').execSync('ls')eval执行代码,过滤了exec,上面的payload用不了网上搜集的payloadrequir......
  • webpack原理(2):ES6 module在Webpack中如何Tree-shaking构建
    Tree-shaking最早由​​打包工具Rollup​​ 提出DCE作用于模块内(webpack的DCE通过UglifyJS完成),而Tree-shaking则是在打包的时候通过模块之间的信息打包必须的代......
  • nodejs的全局变量探讨之二
    之前写过一篇博文对nodejs全局变量做了一些验证,本篇博文将继续探讨这个话题。建议先看下前篇博文:​​https://blog.51cto.com/livestreaming/5258039​​好了,我们开始今天的......
  • webpack原理(2):ES6 module在Webpack中如何Tree-shaking构建
    Tree-shaking最早由打包工具Rollup 提出DCE作用于模块内(webpack的DCE通过UglifyJS完成),而Tree-shaking则是在打包的时候通过模块之间的信息打包必须的代码。We......