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