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 相关文章推荐
jquery 上下滚动广告
Jun 17 Javascript
关于文本框的一些限制控制总结~~
Apr 15 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
jQuery使用之标记元素属性用法实例
Jan 19 Javascript
浅谈javascript 归并方法
Jan 21 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
jQuery实现平滑滚动到指定锚点的方法
Mar 20 Javascript
jquery滚动条插件(可以自定义)
Dec 11 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
Aug 16 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
Apr 12 Javascript
百度小程序之间的页面通信过程详解
Jul 18 Javascript
vue通过接口直接下载java生成好的Excel表格案例
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编写和读取XML的几种方式
2013/01/12 PHP
php自动加载机制的深入分析
2013/06/08 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
Highcharts入门之简介
2016/08/02 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
python中while循环语句用法简单实例
2015/05/07 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
Python常用的json标准库
2019/02/19 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
财务会计专业毕业生自荐信
2013/10/19 职场文书
普通大学毕业生自荐信
2013/11/04 职场文书
中考标语大全
2014/06/05 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
端午节寄语2015
2015/03/23 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android