Q: Differences in way of returning promises I implemented the following two promises:
function getUserSportListPromise(_uid){
        return firebase.database().ref('users/' + user.uid + '/sports/').once('value').then(function(snap){
          var userSportList = [];
          if(snap.exists()){
            snap.forEach(function(sport){
              userSportList.push(sport.val().name);
            });
          }

          return userSportList;
        });
      }

      function getRegistrationsFromSportList(sportList){
        var promiseHash = {};
        sportList.forEach(function (sport){
          promiseHash[sport] = firebase.database().ref('/sport_registrations/' + sport).once('value');
        });
        return $q.all(promiseHash);
      }

Why this code displays the results:
var userSportListPromise = getUserSportListPromise(user.uid);
      var registrationHashPromise = userSportListPromise.then(function(sportList){
        return getRegistrationsFromSportList(sportList);
      }).then(function(registrationsHash){
        angular.forEach(registrationsHash, function(regsSnap, sport){
          console.info(sport + ' has the following registrations: ');
          console.dir(regsSnap);
        });
      });

Whereas this code displays undefined:
getUserSportListPromise(user.uid)
      .then(function(sportList){
          getRegistrationsFromSportList(sportList);
      })
      .then(function(registrationsHash){
        angular.forEach(registrationsHash, function(regsSnap, sport){
          console.dir(registrationsHash);
          console.info(sport + ' has the following registrations: ' + regsSnap);
        });
      });

The function getUserSportListPromise is returning a hash of promises so why the code right above passes an undefined registrationsHash in the last then() call?

A: You're missing a return here:
  .then(function(sportList){
      getRegistrationsFromSportList(sportList);
  })

That anonymous function has no return statement, so it returns undefined. It should be:
  .then(function(sportList){
      return getRegistrationsFromSportList(sportList);
  })

or just:
  .then(getRegistrationsFromSportList)

