替代 async/await

2024-01-08

在我的应用程序中,我有最新分数列表,有时我必须更新。我有这两个函数可以做到这一点。

function handleLastestScoresChange() {
            $scope.newLatestScores = [{}];
            getNewLatestScores().then(function () {
                for (var i = 0; i < 10; i++) {
                    firebase.database().ref('Latest/' + i.toString()).set({
                        user: $scope.newLatestScores[i].username,
                        text: $scope.newLatestScores[i].text,
                        speed: $scope.newLatestScores[i].result,
                        Index: i + 1
                    })
                }
            })
        };



async function getNewLatestScores() {
        for (var i = 9; i >= 0; i--) {
            if (i == 0 && firebase.auth().currentUser.isAnonymous === false) {
                $scope.newLatestScores[i] = ({
                    'username': firebase.auth().currentUser.email,
                    'text': document.getElementById('Title').textContent,
                    'result': $scope.wordsperminute
                })
            }
            else if (i == 0 && firebase.auth().currentUser.isAnonymous === true) {
                $scope.newLatestScores[i] = ({
                    'username': "Anonymous",
                    'text': document.getElementById('Title').textContent,
                    'result': $scope.wordsperminute
                })
            }
            else {
                await firebase.database().ref('Latest/' + (i - 1).toString()).once('value').then(function (snapshot) {
                    $scope.newLatestScores[snapshot.val().Index] = ({
                        'username': snapshot.val().user,
                        'text': snapshot.val().text,
                        'result': snapshot.val().speed
                    })
                })
            }

        }
    }

在 Firebase 中,引用数据库会返回一个 Promise,因此在 getNewLatestScores 函数中,我必须使用 async/await 来确保所有分数都已被读取并位于我的 $scope.newLatestScores 对象中,然后再将它们写入数据库。但现在我的应用程序无法在 Firefox 或 MS Edge 中运行,因为不支持异步/等待。我想知道是否可以达到相同的效果但不使用 async/await。


async/await是供 Promise 使用的语法糖。要将它们从您的代码中删除,只需getNewLatestScores返回一个承诺。

精确的副本将使该函数循环中的每个承诺都等待前一个承诺:

function getNewLatestScores() {
   var promise = Promise.resolve();
   for (var i = 9; i >= 0; i--) {
       if (i == 0 && firebase.auth().currentUser.isAnonymous === false) {
           $scope.newLatestScores[i] = ({
               'username': firebase.auth().currentUser.email,
               'text': document.getElementById('Title').textContent,
               'result': $scope.wordsperminute
           });
       }
       else if (i == 0 && firebase.auth().currentUser.isAnonymous === true) {
           $scope.newLatestScores[i] = ({
               'username': "Anonymous",
               'text': document.getElementById('Title').textContent,
               'result': $scope.wordsperminute
           });
       }
       else {
           promise = promise.then(function() {
               return firebase.database().ref('Latest/' + (i - 1).toString()).once('value').then(function (snapshot) {
                   $scope.newLatestScores[snapshot.val().Index] = ({
                       'username': snapshot.val().user,
                       'text': snapshot.val().text,
                       'result': snapshot.val().speed
                   })
               });
           );
       }
    }
    return promise;
}

...but由于回调似乎并不要求这些串行完成,因此您可以通过尽快启动它们来使它们并行,然后在最后等待Promise.all:

function getNewLatestScores() {
   var promises = [];
   for (var i = 9; i >= 0; i--) {
       if (i == 0 && firebase.auth().currentUser.isAnonymous === false) {
           $scope.newLatestScores[i] = ({
               'username': firebase.auth().currentUser.email,
               'text': document.getElementById('Title').textContent,
               'result': $scope.wordsperminute
           });
       }
       else if (i == 0 && firebase.auth().currentUser.isAnonymous === true) {
           $scope.newLatestScores[i] = ({
               'username': "Anonymous",
               'text': document.getElementById('Title').textContent,
               'result': $scope.wordsperminute
           });
       }
       else {
           promises.push(firebase.database().ref('Latest/' + (i - 1).toString()).once('value').then(function (snapshot) {
               $scope.newLatestScores[snapshot.val().Index] = ({
                   'username': snapshot.val().user,
                   'text': snapshot.val().text,
                   'result': snapshot.val().speed
               })
           }));
       }
    }
    return Promise.all(promises);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替代 async/await 的相关文章

随机推荐

  • 如何将 SQLite3 数据库更改刷新到磁盘?

    我的应用程序在便携式 Debian 5 和 8 计算机上运行 这台计算机可能会在不可预测的时间断电 该应用程序经常更新特定的 SQLite3 数据库 并立即刷新到磁盘 使用sync 命令 这样做是为了避免数据库损坏 这种情况会在更改完全写入
  • layout_gravity 上的动画

    在Android中 是否可以应用动画layout gravity 例如假设我想改变layout gravity of a View e g Button 从右到左
  • 如何在 Capybara 中使用 ruby​​-debug 和 selenium

    我们让 Capybara 使用 selenium 驱动程序 但是当我尝试在步骤中使用 调试器 时 它不太工作 例如在调试控制台中输入 page 有效 但输入 page body 会挂起 当尝试将调试器与 akephalos 驱动程序一起使用
  • Rails 路由中要测试什么?

    我很好奇人们认为什么是充分 彻底的路线测试 和我一起工作的一个人似乎想要断言every路线在我们的路线文件中 无论多么标准 我觉得这是浪费时间 但也许我错了 而且我没有意识到这有一些价值 在某些情况下 我可以看到路由的一些价值 我们仍然有一
  • 后台大JSON优化解析

    我正在解析类似于的大型 JSON 数据像这样的一个 https mangadex org api manga 153 大约有3000 chapter这里的对象 我只需要那些chapter对象与 lang code gb 大约有 1300 个
  • 作为页面发布到 Facebook 页面墙

    我想使用 PHP 作为页面发布到 facebook 页面墙 我通过下面的链接获得了access token https graph facebook com oauth authorize type user agent client id
  • OpenCL 中的最佳本地/全局工作规模

    我想知道如何在 OpenCL 中为不同设备选择最佳的本地和全局工作大小 AMD NVIDIA INTEL GPU 有什么通用规则吗 我是否应该分析设备的物理构建 多处理器数量 多处理器中的流处理器数量等 这取决于算法 实现吗 因为我看到一些
  • 如何以编程方式将视图控制器嵌入到导航视图控制器中

    我正在尝试将视图控制器嵌入到导航视图控制器中 以便获得导航栏和所有其他内容 例如后退按钮 我想以编程方式完成它 它是这样完成的 example ViewController let myVC UIViewController create
  • Xcode:ld:找不到 -lAFNetworking 的库

    由于这个原因 构建总是失败 关于我可以尝试什么的任何想法 编辑 解决方案是打开 xcworkspace 而不是 xcproject 可能是您在安装 pod 后打开 xcodeproj 文件 关闭项目并打开 xcworkspace 文件
  • 从文件输入中查找java中的最大值

    我是Java新手 我正在尝试编写一个程序 要求用户输入仅包含数字的txt文件的名称 该程序将输出文件中数字的总和 平均值 最大值和最小值 我已经编写了程序的大部分内容 但是我一直在尝试找到值的最大值和最小值 您提供的任何信息都会有所帮助 如
  • 运行 sp_executesql 查询需要参数 @statement

    我不确定如何解决此错误 过程或函数 sp executesql 需要参数 statement 但未提供该参数 对于此查询 DECLARE a INT DECLARE b VARCHAR SET a 1 WHILE a lt 30 BEGIN
  • Python lxml etree.tostring() 返回在 mod_wsgi 上运行的空字符串

    我在 CentOS 6 8 上有 Python 2 7 8 我的服务器是基于 Apache2 WSGI 构建的 我的应用程序应该处理通过 http POST 收到的日期 然后根据从本地 xml 文件获取的 XML 模板创建指令 最后 它必须
  • 如何在C中获取grep的输出[重复]

    这个问题在这里已经有答案了 我正在使用函数 execl 在我的 C 代码中执行 grep 命令 并且我想在我的 C 程序中使用此命令的输出 我该怎么做 您可以使用popen include
  • 如何将调试断点添加到 Visual Studio 2015 中“查找结果”窗口中显示的行

    之前版本的 Visual Studio VS 已回答过此问题 提供的解决方案涉及宏 这些宏在 VS 2015 中不再可用 我可以获得 VS 2015 的解决方案吗 我想在 VS 中进行 查找全部 并在查找匹配的每一行上放置一个调试断点 链接
  • 如何使用新的 YouTube 数据 API (V3) 获取特定频道的已上传视频列表?

    我正在尝试获取所有上传到频道的视频的视频 ID 列表 我还想使用新版本的 YouTube Data API V3 我该怎么做呢 您必须获取上传播放列表 ID 才能上传每个视频 为此 您需要获取频道 ID 从频道 ID 获得播放列表 ID 后
  • 如何更改matplotlib中误差线限制的标记符号?

    只是一个简单的问题 我在其中找不到任何有用的信息plt errorbar文档 https matplotlib org 3 1 1 api as gen matplotlib pyplot errorbar html 我想用误差线绘制值 i
  • mongodb服务器端javascript实际上是客户端?

    我有大量文档 我想提取一些统计数据 需要每 15 分钟定期执行一次 大多数统计数据都是基于文档大小 因此我需要获取文档并计算其大小 我的统计信息的输出只是一行 其中包含一些有关文档大小的统计信息 我没有获取整个集合 只是它的一个子集 所以我
  • SHA 和 AES 加密有什么区别? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 SHA 和 AES 加密有什么区别 SHA 不是加密 它是一种单向哈希函数 AES 高级加密标准 是一种对称加密标准 AES 参考 http en w
  • Spring集成IDE

    我记得在 Spring Tool Suite 中看到过用于设计 Spring Integration 工作流程的调色板 很久以前 但我在 Spring Tool Suite 4 x 中找不到它 有人可以告诉我它是否可以作为单独的附加组件使用
  • 替代 async/await

    在我的应用程序中 我有最新分数列表 有时我必须更新 我有这两个函数可以做到这一点 function handleLastestScoresChange scope newLatestScores getNewLatestScores the