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 相关文章推荐
return false;和e.preventDefault();的区别
Jul 11 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
Apr 27 Javascript
jQuery表格排序组件-tablesorter使用示例
May 26 Javascript
原创jQuery弹出层插件分享
Apr 02 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
jQuery实现背景弹性滚动的导航效果
Jun 01 Javascript
微信小程序 for 循环详解
Oct 09 Javascript
很棒的一组js图片轮播特效
Jan 12 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 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
laravel框架与其他框架的详细对比
2019/10/23 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
js弹出窗口简单实现代码
2017/03/22 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
用python进行视频剪辑
2020/11/02 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
Hammitt官网:设计师手袋
2020/05/23 全球购物
会计专业推荐信
2013/10/29 职场文书
公积金单位接收函
2014/01/11 职场文书
初中政治教学反思
2014/01/17 职场文书
学校节能减排倡议书
2014/05/16 职场文书
酒店管理求职信
2014/06/09 职场文书
校长四风对照检查材料
2014/09/27 职场文书
停电通知范文
2015/04/16 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
python中的sys模块和os模块
2022/03/20 Python