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 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
javascript属性访问表达式用法分析
Apr 25 Javascript
javascript检测两个数组是否相似
May 19 Javascript
学习jQuey中的return false
Dec 18 Javascript
js 获取元素所有兄弟节点的实现方法
Sep 06 Javascript
如何写好你的JavaScript【推荐】
Mar 02 Javascript
80%应聘者都不及格的JS面试题
Mar 21 Javascript
Javascript操作dom对象之select全面解析
Apr 24 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
React Form组件的实现封装杂谈
May 07 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
Feb 02 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
python opencv之SIFT算法示例
2018/02/24 Python
python中的字符串内部换行方法
2018/07/19 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
python deque模块简单使用代码实例
2020/03/12 Python
Python创建临时文件和文件夹
2020/08/05 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
介绍一下Linux中的链接
2016/06/05 面试题
单位授权委托书范文
2014/08/02 职场文书
作风转变年心得体会
2014/10/22 职场文书
实习指导教师评语
2014/12/30 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python