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