在我的应用程序中,我有最新分数列表,在某些时候我必须更新。我有这两个功能。
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对象中,然后才将它们写入数据库。但是由于不支持async / await,现在我的应用程序在Firefox或MS Edge中无法工作。我想知道我是否可以有相同的效果但不使用async / await。
答案 0 :(得分:4)
async
/ await
是承诺使用的语法糖。要从代码中删除它们,只需让getNewLatestScores
返回一个承诺。
一个精确的副本会使该函数循环中的每个promise等待前一个:
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;
}
... 但是,因为回调似乎并不要求这些都是串行完成的,你可以让它们并行,而不是尽快将它们全部启动,然后等待最后有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);
}