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的作用及使用场景【说明】
创业网站制作流程,创业网站可靠吗?

