javascript-解决mongoose数据查询的异步操作

发布时间 - 2026-01-10 22:00:33    点击率:

当我在在node环境下操作mongoose时候,发现我通过嵌套形式查询将数据循环放入一个数组时,最后得到数组一直为空,几经百度,依然无果,最后问群里的大神,原来是mongoose以及node异步造成的,百度了解决的办法,以下是我用的一个我认为比较简便的方法。

//原来的代码
var shoppingModel = global.dbHandle.getModel('shopping');
var cartsshop = [];
for(var i = 0;i<carts.length;i++){
shoppingModel.findOne({title:carts[i].title},function (err,shops) {
  if(err){
    return next(err);
  }else{
    cartsshop.push(shops);
  }
 });
}
console.log(cartsshop);//[]

通过引入node自身含有的方法events.

events

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

EventEmitter 类

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
你可以通过require(“events”);来访问该模块。

以下是一个实例,

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
  console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
  event.emit('some_event'); 
}, 1000); 

将我自己的代码进行改进,如下:

var shoppingModel = global.dbHandle.getModel('shopping');
var cartsshop = [];
var obj ;
var j = 0;
var myEventEmitter = new events.EventEmitter();
myEventEmitter.on('next',addResult);
function addResult() {
  cartsshop.push(obj);
  j++;
  if(j==carts.length){
    console.log(cartsshop);
    res.json(cartsshop);
  }
}
for(var i = 0;i<carts.length;i++){
  var ii = i;
 shoppingModel.findOne({title:carts[ii].title},function (err,shops) {
  if(err){
    return next(err);
  }else{
    obj = shops;
    myEventEmitter.emit('next');
  }
 });
}

当然使用之前必须引入

var events = require('events');

最后,就成功将数据取出,并返回给客户端啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# mongoose  # 异步  # 查询  # mongoose查询  # JavaScript异步操作的几种常见处理方法实例总结  # 解决Angularjs异步操作后台请求用$q.all排列先后顺序问题  # ES6 javascript的异步操作实例详解  # async/await与promise(nodejs中的异步操作问题)  # thinkjs之页面跳转同步异步操作  # 一个简单的Node.js异步操作管理器分享  # JavaScript异步操作中串行和并行  # 会在  # 自己的  # 都是  # 是一个  # 你可以  # 当我  # 我认为  # 我用  # 大神  # 将我  # 只提供  # 大家多多  # 为空  # 群里  # 客户端  # 无果  # 来访问  # getModel  # shopping  # dbHandle 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 三星网站视频制作教程下载,三星w23网页如何全屏?  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  详解MySQL数据库的安装与密码配置  如何在搬瓦工VPS快速搭建网站?  高防服务器租用指南:配置选择与快速部署攻略  如何用低价快速搭建高质量网站?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Python面向对象测试方法_mock解析【教程】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  英语简历制作免费网站推荐,如何将简历翻译成英文?  JavaScript如何实现路由_前端路由原理是什么  如何快速启动建站代理加盟业务?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Java遍历集合的三种方式  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  zabbix利用python脚本发送报警邮件的方法  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  利用vue写todolist单页应用  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何快速完成中国万网建站详细流程?  动图在线制作网站有哪些,滑动动图图集怎么做?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何快速搭建高效服务器建站系统?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何在腾讯云服务器快速搭建个人网站?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  千库网官网入口推荐 千库网设计创意平台入口  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在云指建站中生成FTP站点?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  创业网站制作流程,创业网站可靠吗?