javascript - 如何在 firebase 中使用承诺?

2024-01-09

最近我被一个问题困扰,不知道如何解决。我问this https://stackoverflow.com/questions/47775150/javascript-then-executing-before-the-loop-completes-in-firebase/47775453问题,经过一番努力,我们发现 Firebase 的 Promise 工作方式与正常请求不同,而且我无法正确使用它们。
正如中所解释的问题 https://stackoverflow.com/questions/47775150/javascript-then-executing-before-the-loop-completes-in-firebase/47775453,我正在用 Firebase 中的一些信息填充一个数组,当我确定数组已填充时,换句话说,当我确定对 Firebase 的调用已完成时,我需要调用另一个方法。 这是我现在使用的代码:

var user_pref = firebase.database().ref('/users/'+ self.api.email_id+'/preferenze/');
      var ref = firebase.database().ref('/tag/')
var userTags = [];
var self1 = self;
user_pref.once('value', function(preferenze) { 
  preferenze.forEach(function(t) {
    ref.once('value', function(tags) { 
      tags.forEach(function(t1) {
        if (t.key == t1.key) { 
          console.log("Found " + t1.key)
          userTags.push(t1.key)
        }
        return false;
      });
    })
    return false;
  });
}).then(a =>{
  await this.sleep(1000) //----> WORKAROUND
  console.log("Out")
  this.myTags = userTags
  this.findPoiByTag(this.myTags) //method I have to call when finished
})

我正在使用这种可怕的解决方法与睡眠,以确保外部代码在内部代码之后执行。如果没有它,它会先打印“Out”,然后打印循环中的所有“Found”。我已经尝试以各种方式使用它与承诺,但它仍然不起作用。看看文档在这里 https://firebase.google.com/docs/functions/terminate-functions?hl=en我找不到任何可以帮助我的东西。


这确实很糟糕。

这应该更接近您所需要的:

var userTags = [];
var self1 = self;
user_pref.once('value', function(preferenze) { 
  var promises = [];
  preferenze.forEach(function(t) {
    promises.push(ref.child(t.key).once('value'));
  });
  Promise.all(promises).then(function(snapshots) {
    snapshots.forEach(function(snapshot) {
      if (snapshot.exists()) {
        userTags.push(snapshot.key);
      }
    });
  })
  this.myTags = userTags
  this.findPoiByTag(this.myTags) //method I have to call when finished
});

这有什么不同之处:

  1. 它通过直接查看加载每个首选项键(消除了加载过多数据的深层嵌套循环的需要)。
  2. 它将所有类别的负载放入一系列承诺中。
  3. 然后,它会在所有承诺都解决后调用您的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript - 如何在 firebase 中使用承诺? 的相关文章

随机推荐

  • 缩放后为不同标签设置相同的字体大小

    我正在制作一个有 3 个标签的应用程序 我正在使用标签自动收缩来帮助调整标签的字体大小以适应设备 这些标签彼此相邻 因此这意味着我希望它们具有相同的字体大小 目前发生的情况是 因为它们有不同数量的文本 它们最终会缩小到不同的字体大小 有没有
  • 混淆 JavaFX 应用程序

    由于 fxml files 使用控制器类来处理事件 那么如何混淆 JavaFX 应用程序呢 当混淆的控制器类具有不同的名称和路径时 fxml 文件无法找到它们 混淆后编辑 fxml 文件不是我正在寻找的解决方案 还有其他选择吗 没有必要重新
  • OkHttp SSLHandshakeException SSL 握手中止 SSL 库中出现故障,协议错误

    04 23 17 17 38 434 21599 21956 D NativeCrypto ssl 0x0 NativeCrypto SSL interrupt 04 23 17 17 38 435 21599 21956 D OkHttp
  • 夏令时和 Cron

    如果 Cron 有一项工作安排在凌晨 2 点运行 另一项工作在凌晨 3 点运行 这些工作将如何受到夏令时的影响 当时间向后移动一小时时 时间是否会直接从凌晨 2 59 59 变为凌晨 2 00 00 这意味着凌晨 2 点的作业将运行两次 凌
  • 运行时设置 TextView 在 RemoteView 中的位置

    亲爱的大家 我正在尝试在应用程序小部件中设置 TextView 的位置 基本上 直接访问 TextView 的属性是有效的 myRemoteView setTextColor R id myTextView Color WHITE work
  • 检测鼠标被按住

    我试图检测何时按住鼠标而不是单击鼠标 这就是我所拥有的 但我希望能够检测到鼠标被按住 而不是点击计数 void mouseDown NSEvent event instead of clickCount I want my if state
  • 为什么 `'↊'.isnumeric()` 为 false?

    根据官方 Unicode 联盟代码表 http www unicode org charts PDF U2150 pdf 所有这些都是数字 然而 当我要求 Python 告诉我哪些是数字时 它们都是数字 甚至 除了四个 In 252
  • Postgres 中从多行到单列

    我通过 pgAdmin 4 使用具有只读访问权限的 Postgres 9 5 并且尝试编写一个选择查询来转换来自此表单的数据 username filters groups roles kd24 Khaled lt 27607 gt V1
  • 如何使用 SIMD 比较两个向量并获得单个布尔结果?

    我有两个分别包含 4 个整数的向量 我想使用 SIMD 命令来比较它们 假设根据比较结果生成一个结果向量 其中每个条目为 0 或 1 然后 我想将结果向量与 4 个零的向量进行比较 只有当它们相等时才执行某些操作 你知道我可以使用哪些 SI
  • 如何根据对象的属性比较两个 NSSet?

    我有两个 nsset nsset1 person id 1 person id 2 person id 3 nsset2 person id 1 person id 2 结果应该是 nsset1 nsset2 person with id
  • 在自己的 php 框架中管理 URL 路由

    我正在创建一个 PHP 框架 但我有一些疑问 框架以这种方式获取 url http web com site index 它采用第一个参数来加载控制器 site 然后加载特定的动作 index 如果您已将框架安装在基本 URL 中 则可以正
  • 如何在 Cypress.io 中强制测试失败

    在 Cypress io 中 如果满足特定条件 有没有一种方法可以强制测试失败 例如 在我的网页上 如果字符串 抱歉 出了点问题 出现在我希望测试失败的页面上 目前这就是我正在做的事情
  • 有什么方法可以知道哪个集合视图单元格位于特定点?

    我有一个 CGPoint 我想知道我的集合视图中的哪个单元格当前包含该点 有什么简单的方法可以做到这一点还是我必须编写自己的方法 我没用过UICollectionView就这么多 但有一个看起来很完美的方法 NSIndexPath inde
  • 在 Visual Studio 项目模板中添加引用?

    我正在为 VS2015 创建一个多项目模板 其中创建的项目之一引用另一个项目 如何使用模板添加参考 如果我使用 VS GUI 添加引用 它会将以下内容添加到 vcxproj 文件中
  • 理解 Node.js 中的 Promise 拒绝

    我正在尝试理解 Node js 中的 Promise 这是示例代码 con queryReturnPromise SELECT FROM bookings WHERE driverId accId AND bookingStatus con
  • dart / flutter 使用 sudo 运行进程

    我想为 mac 桌面开发一个 flutter 应用程序并使用以下命令访问 macs powermetricssudo powermetrics有没有办法在第一次运行时向用户询问此命令的 sudo 权限 嗨 我只是在玩颤振 我正在解决同样的问
  • 快捷栏操作文本颜色未改变

    我想更改小吃栏的操作文本颜色 但由于某种原因它不起作用 我使用以下代码来显示小吃栏 Snackbar make findViewById R id root text Snackbar LENGTH LONG setActionTextCo
  • knex:从结果创建数组的适当方法是什么?

    我有一个端点连接user and user emails表作为一对多关系 postgresql 它看起来如下 router get function req res next db select users id users name us
  • 以编程方式将元素拖放到另一个元素上

    使用 jQuery UI 是否可以使用 JavaScript 执行拖放操作 Example http jsfiddle net KFRu9 单击链接后 将 pony并将其放入 box 我尝试过触发拖动事件 但这似乎不起作用 pony tri
  • javascript - 如何在 firebase 中使用承诺?

    最近我被一个问题困扰 不知道如何解决 我问this https stackoverflow com questions 47775150 javascript then executing before the loop completes