MongoDB动态加载
MongoDB dynamic loading
好的这是我在图像显示代码中的第一个函数:
function init() {
socket.on('getPictures', function(data) {
images = data;
loadImages();
});
console.log("loading");
socket.emit('getPictures');
}
'getPictures'调用使用db.collection.find({})返回数据库中的每个文档。这些文档具有名称、来源(64位字符串)等属性,以及客户端可以放在每张图片上的一些标记。Images是保存我所有文档的数组。
下面是mongo端代码:socket.on('getPictures', function() {
console.log("getting pictures");
Picture.find({}, function(err, data) {
if(err) console.log(err);
else
io.emit('getPictures', data);
});
});
通过使用db.collection.find({})方法,我一次接收了所有的图片,我的程序有一个荒谬的加载时间(因为有很多图片)。是否有任何方法我可以加载一次文件从mongo,然后将其放入图像?mongo是否有办法知道它是否已经完成了对某个文档的查询?如果是这样的话,我已经有了从图像动态创建和绘制每个画布的方法,所以我基本上可以消除它们繁重的加载时间。
我真的是新的javascript(和编程),所以我很抱歉,如果我没有提供足够的信息。我正在试着掌握窍门。
我想到了两种有用的方法。首先,您可以使用Mongoose(我猜您正在使用代码中的Mongoose)返回游标作为回调的参数,以便在从数据库查询返回图像时单独或批量发送图像。您可以控制批大小以找到适当的平衡。修改你的代码,
socket.on('getPictures', function() {
console.log("getting pictures");
Picture.find({}, function(err, cursor) {
if(err)
console.log(err);
else
cursor.each(function(err, doc) {
io.emit('aPicture', doc);
});
});
});
然后绘制在客户端接收到的每个图片,关闭aPicture
套接字事件。您可以通过修改find()
回调来在发送到客户端之前积累一个数组或其他东西来批量发送而不是单个图片。
另一种方法依赖于两个假设:首先,您的客户端程序是一个浏览器,其次,您正在用简单的<img src=>
类型的HTML标记显示图像。浏览器被优化为并行加载和呈现大量这些标签,因为大多数现代网站的页面都有许多图像。在这种情况下,您可以像现在一样获得所有结果,但是只需将_id
或其他一些唯一标识符发送回客户机。然后有另一个可以调用的url,如/images/:_id
,它将查找并响应图像的二进制数据,因此您可以创建一个动态图像标记,如<img src="/images/my_dog_ralphie.jpg">
。你可以使用jQuery或其他东西,按顺序制作很多这些,然后它们都将异步加载并呈现实际图像,并与浏览器处理的细节并行。我不能说得太具体,因为我不知道你的应用程序的整个技术栈。
- UIWebview赢得't通过基本身份验证加载动态加载的资源(通过jQuery mobile)
- 我们可以加载动态角度对话框吗
- 使用JQuery在遗留html中加载动态AngularJS
- 谷歌地图在angularjs中懒惰加载动态地理坐标更新
- 正在加载动态日历以在一个月的正确日期开始
- 从服务器和/或客户端加载动态元素的典型技术是什么
- 如何加载动态更改的css文件
- jQuery 时间选取器未加载动态文本字段
- 如何在Highslide中加载动态生成的iframe
- 有没有办法避免角加载动态构建页面时的抖动效应
- 加载动态添加的输入字段
- 用于加载动态 JSON 数据的 JQuery 移动事件
- 手控表未加载动态创建的列标题
- 如何在 ag-grid 中从 http 调用加载动态列和行(列和记录都应该是动态的)
- Jquery 在 Firefox 中的自定义对象参数(动态导航加载动态内容)
- 延迟加载动态驱动器内容选项卡
- Angular JS ui-router - 加载动态视图和动态控制器
- 防止在引导选项卡中加载动态连续网络两次
- 使用 nodejs 加载动态 html
- 如何在 XSLT 中加载动态内容时创建函数