Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 替代异步/等待_Javascript_Angularjs_Asynchronous_Firebase - Fatal编程技术网

Javascript 替代异步/等待

Javascript 替代异步/等待,javascript,angularjs,asynchronous,firebase,Javascript,Angularjs,Asynchronous,Firebase,在我的应用程序中,我有最新的分数列表,在某个时候我必须更新。我有两个函数可以做到这一点 function handleLastestScoresChange() { $scope.newLatestScores = [{}]; getNewLatestScores().then(function () { for (var i = 0; i < 10; i++) { fi

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

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中,引用数据库会返回一个承诺,因此在getNewLatestScores函数中,我必须使用async/await,以确保所有分数都已读取并且在$scope.newLatestScores对象中,然后才能将它们写入数据库。但现在我的应用程序无法在Firefox或MS Edge中运行,因为不支持async/await。我想知道,如果不使用async/await,我是否可以达到同样的效果。

async/await是用于承诺的语法糖。要从代码中删除它们,只需让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;
}
…但由于回调似乎不要求这些操作以串联方式完成,因此您可以通过尽快将它们全部关闭,然后在最后承诺等待,从而使它们并行。全部:

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);
}