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

for循环中的事务完成后,firebase实时数据库重新加载

for循环中的事务完成后,firebase实时数据库重新加载

慕盖茨4494581 2022-12-22 14:32:17
我有以下代码。for (var i = 0; i < array.length; i++) {          let brand = array[i];          // handle analytics          database.ref("brands/" + brand).transaction(function (post) {            if (post) {              if (post.followers != null) {                post.followers++;              } else {                post.followers = 1;              }            }            return post;          });}// once all is done, trigger a reload// window.location.reload();基本上,我在 for 循环中处理一些交易分析。但是,我希望在 for 循环中完成所有事务window.location.reload后做一个。(我相信如果我在 for 循环之后立即触发 reload,所有的事务可能还没有完成,会被 reload 打断。)我不太确定如何解决这个问题(使用异步、等待、链接承诺等),所以我想知道解决此类问题的最直接方法是什么!谢谢!
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

由于您知道需要运行多少个事务 ( array.length),您可以计算完成了多少个事务,然后在最后一个之后重新加载窗口:


let doneCount = 0;

for (var i = 0; i < array.length; i++) {

  let brand = array[i];

  database.ref("brands/" + brand).transaction(function (post) {

    if (post) {

      if (post.followers != null) {

        post.followers++;

      } else {

        post.followers = 1;

      }

    }

    return post;

  }, function(error, committed, snapshot) {

    if (doneCount++ == array.length) {

      window.location.reload();

    }

  });

}

另请参阅runTransaction.


但是几个月后,有一种更简单的方法可以做到这一点:使用ServerValue.increment()运算符。事实上,有了它,您可以将整个循环组合成一个更新语句:


let updates = {};

for (var i = 0; i < array.length; i++) {

  let brand = array[i];

  updates[`brands/${brand}] = firebase.database.ServerValue.increment(1);

}

database.ref().update(updates);

简单多了!


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信