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 toFixed() 方法
Apr 15 Javascript
js实现翻页后保持checkbox选中状态的实现方法
Nov 03 Javascript
每天一篇javascript学习小结(Function对象)
Nov 16 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
js读取json文件片段中的数据实例
Mar 09 Javascript
在node中如何使用 ES6
Apr 22 Javascript
vue 不使用select实现下拉框功能(推荐)
May 17 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 Javascript
JavaScript中变量提升机制示例详解
Dec 27 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
详解Vue中的MVVM原理和实现方法
Jul 15 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 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
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
javascript self对象使用详解
2016/10/18 Javascript
详解jQuery选择器
2016/12/21 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python中正则表达式的使用详解
2014/10/17 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
python生成大写32位uuid代码
2020/03/03 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
个人应聘自我评价分享
2013/11/18 职场文书
便利店投资创业计划书
2014/02/08 职场文书
高中军训感言200字
2014/02/23 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
群众路线领导对照材料
2014/08/23 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
小学感恩节活动总结
2015/03/24 职场文书
手写实现JS中的new
2021/11/07 Javascript
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js