全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

javascript-解决mongoose数据查询的异步操作

当我在在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');

最后,就成功将数据取出,并返回给客户端啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# mongoose  # 异步  # 查询  # mongoose查询  # JavaScript异步操作的几种常见处理方法实例总结  # 解决Angularjs异步操作后台请求用$q.all排列先后顺序问题  # ES6 javascript的异步操作实例详解  # async/await与promise(nodejs中的异步操作问题)  # thinkjs之页面跳转同步异步操作  # 一个简单的Node.js异步操作管理器分享  # JavaScript异步操作中串行和并行  # 会在  # 自己的  # 都是  # 是一个  # 你可以  # 当我  # 我认为  # 我用  # 大神  # 将我  # 只提供  # 大家多多  # 为空  # 群里  # 客户端  # 无果  # 来访问  # getModel  # shopping  # dbHandle 


相关文章: php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何选择高性价比服务器搭建个人网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何设计高效校园网站?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站主机服务器选型指南与性能优化方案解析  建站之星导航配置指南:自助建站与SEO优化全解析  网页设计网站制作软件,microsoft office哪个可以创建网页?  建站10G流量真的够用吗?如何应对访问高峰?  广州营销型建站服务商推荐:技术优势与SEO优化解析  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  广州美橙建站如何快速搭建多端合一网站?  如何在建站之星网店版论坛获取技术支持?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在阿里云部署织梦网站?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站主机是什么?如何选择适合的建站主机?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何挑选优质建站一级代理提升网站排名?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  历史网站制作软件,华为如何找回被删除的网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  上海网站制作开发公司,上海买房比较好的网站有哪些?  图册素材网站设计制作软件,图册的导出方式有几种?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站之星安装失败:服务器环境不兼容?  c# 服务器GC和工作站GC的区别和设置  岳西云建站教程与模板下载_一站式快速建站系统操作指南  完全自定义免费建站平台:主题模板在线生成一站式服务  如何基于云服务器快速搭建网站及云盘系统?  深入理解Android中的xmlns:tools属性  建站主机无法访问?如何排查域名与服务器问题  如何在阿里云ECS服务器部署织梦CMS网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  营销式网站制作方案,销售哪个网站招聘效果最好?  制作公司内部网站有哪些,内网如何建网站?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何通过建站之星自助学习解决操作问题?  如何在IIS7中新建站点?详细步骤解析  如何确认建站备案号应放置的具体位置?  代刷网站制作软件,别人代刷火车票靠谱吗?  如何通过VPS建站无需域名直接访问? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。