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 函数对象的多重身份
Jun 28 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
微信小程序动态的加载数据实例代码
Apr 14 Javascript
详解vue.js的devtools安装
May 26 Javascript
JS自动生成动态HTML验证码页面
Jun 14 Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
JS+php后台实现文件上传功能详解
Mar 02 Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 Javascript
详解js中的几种常用设计模式
Jul 16 Javascript
Element Backtop回到顶部的具体使用
Jul 27 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下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
会计电算化大学生职业规划书
2014/02/05 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
公司给客户的感谢信
2015/01/23 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python