为了账号安全,请及时绑定邮箱和手机立即绑定

防止从 firebase 获取数据的延迟时间

防止从 firebase 获取数据的延迟时间

哔哔one 2022-01-07 19:05:37
笔记:firebase 的异步特性已经在这里讨论了数千次,但我的低声誉数字不允许对现有问题发表评论。这就是我问这个问题的原因。我是菜鸟,所以请帮助我以易于理解的方式理解实现。实施步骤:用户在 HTML 输入框中输入值在 firebase db 中搜索输入值(调用 showMessage())根据步骤 2 中的搜索结果显示适当的结果面临的问题:步骤 3 中显示的消息平均需要 1.75 秒才能显示。这种体验对用户不友好。我想尽快显示消息,即想减少获取时间。可能的根本原因:我从 firebase dB 获取数据的方式不正确(我仍然不明白如何信守承诺 :()或者搜索和显示的机制不对var full_name; function showMessage(){      extractData();    }function extractData(){     test(function(returnValue) {        custom_message = searchMessage(returnValue);        var container = document.querySelector('#placeholder');        var para = document.createElement('p');        var custom_message = "Happy happy, buds!";        para.innerHTML = custom_message;        para.className = "message";        container.appendChild(para);    });}function test(callback) {     var ref = firebase.database().ref();    ref.on('value', function(snapshot) {    var data = snapshot.val();    callback(data);   }, function (error) {       console.log("Error: " + error.code);    });}function searchMessage(data){    for(var i = 0; i < data.length; i++)    {        name_f_data = data[i].firstName.concat(" ", data[i].lastName);        if(full_name.toLowerCase() == name_f_data.toLowerCase())        {            console.log(name_f_data.toLowerCase());            console.log(full_name.toLowerCase());            return data[i].message;        }    }}
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

读取操作所需的时间取决于:

  1. 您连接到 Firebase 服务器的延迟

  2. 您正在读取的数据量

  3. 您的连接带宽

  4. Firebase 处理请求所需的时间

在大多数情况下,Firebase 所花费的时间只是总时间的很小一部分,而您的大部分时间实际上都花在了数据传输上,这完全取决于带宽和数据量。如果这是您第一次在页面中从 Firebase 读取数据,则延迟也更重要,因为 Firebase 必须建立连接,这需要几次往返。

您当前的代码正在从数据库中下载所有数据,然后在 JavaScript 代码中搜索与某个值匹配的子节点。减少所需时间的最佳方法(除了升级到快速连接)是传输更少的数据,您可以使用 Firebase 的查询机制在服务器上进行过滤。

你可以非常接近:

var ref = firebase.database().ref();

var query = ref.orderByChild().startAt(firstName).endAt(firstName+"~");

query.once('value', function(snapshot) {

  var data = snapshot.val();

  callback(data);

这将显着减少传输的数据量。不过有几点注意事项:

  1. 该查询仅返回具有您要查找的名字的人。它还没有过滤姓氏,所以你仍然需要在客户端代码中过滤它。

  2. 为了进一步优化这一点,请将全名(您现在在客户端代码中编写)存储在数据库中,以便您可以对其进行查询并进一步减少数据传输。

  3. Firebase 查询区分大小写,因此查询仅返回大小写完全匹配的数据。如果要查询不区分大小写,请考虑toLowerCase()在数据库中存储一个值。

  4. 请务必在 上定义索引firstName,否则 Firebase 数据库仍会将所有数据发送到客户端,SDK 将在客户端执行过滤。


查看完整回答
反对 回复 2022-01-07
  • 1 回答
  • 0 关注
  • 297 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号