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


Posted in Javascript onDecember 22, 2016

当我在在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');

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

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

Javascript 相关文章推荐
javascript 写类方式之八
Jul 05 Javascript
jQuery 表格插件整理
Apr 27 Javascript
javascript 词法作用域和闭包分析说明
Aug 12 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
Sep 28 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
three.js 入门案例详解
Jan 23 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
May 23 Javascript
微信小程序进入广告实现代码实例
Sep 19 Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 Javascript
Bootstrap popover用法详解
Dec 22 #Javascript
深入学习jQuery中的data()
Dec 22 #Javascript
读Javascript高性能编程重点笔记
Dec 21 #Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 #Javascript
原生的强大DOM选择器querySelector介绍
Dec 21 #Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
Dec 21 #Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
Dec 21 #Javascript
You might like
国内php原创论坛
2006/10/09 PHP
PHP 正则表达式小结
2015/02/12 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
如何用python写一个简单的词法分析器
2018/12/18 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
法人代表授权委托书
2014/04/08 职场文书
企业文化标语大全
2014/06/10 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
催款函怎么写
2015/06/24 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server