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

我有以下代码。


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 打断。)


我不太确定如何解决这个问题(使用异步、等待、链接承诺等),所以我想知道解决此类问题的最直接方法是什么!谢谢!


慕盖茨4494581
浏览 69回答 1
1回答

眼眸繁星

由于您知道需要运行多少个事务 ( array.length),您可以计算完成了多少个事务,然后在最后一个之后重新加载窗口:let doneCount = 0;for (var i = 0; i < array.length; i++) {&nbsp; let brand = array[i];&nbsp; database.ref("brands/" + brand).transaction(function (post) {&nbsp; &nbsp; if (post) {&nbsp; &nbsp; &nbsp; if (post.followers != null) {&nbsp; &nbsp; &nbsp; &nbsp; post.followers++;&nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; post.followers = 1;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return post;&nbsp; }, function(error, committed, snapshot) {&nbsp; &nbsp; if (doneCount++ == array.length) {&nbsp; &nbsp; &nbsp; window.location.reload();&nbsp; &nbsp; }&nbsp; });}另请参阅runTransaction.但是几个月后,有一种更简单的方法可以做到这一点:使用ServerValue.increment()运算符。事实上,有了它,您可以将整个循环组合成一个更新语句:let updates = {};for (var i = 0; i < array.length; i++) {&nbsp; let brand = array[i];&nbsp; updates[`brands/${brand}] = firebase.database.ServerValue.increment(1);}database.ref().update(updates);简单多了!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript