2017-03-11 18 views
1

私のアプリでは、ある時点で更新する必要がある最新のスコアのリストがあります。私はそうする2つの機能を持っています。 Firebaseでasync/awaitの代わりに

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

     } 
    } 

データベースを参照getNewLatestScores機能で、私は非同期を使用する/すべてのスコアが読み込まれたことを確認するために待っていたと私はそれらを書く前に、私の$ scope.newLatestScoresオブジェクトであるように、約束を返します。データベース。しかし、私のアプリは、async/awaitをサポートしていないため、FirefoxやMS Edgeなどでは動作しません。 async/awaitを使わずに同じ効果を得ることができるのだろうかと思っていました。

答えて

5

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

... しかしコールバックは、これらが直列に行われることを要求していないようですから、できるだけ早くすべてをオフにしてから、最後に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); 
}