2016-10-24 7 views
0

私は、データを取得し、配列を構築するサービスFirebaseを持っています。私はangular.foreachを実行し、値をテーブルに入れて、私はゼロをインスタンス化します。

しかし、それは私に空の配列を返します。

私はそれが私にオブジェクトの配列を返すことを望むマーカー。

これは私のサービスです。

(function() { 

    'use strict'; 

    angular 

    .module('app.pages.cartographie') 

    .factory('DeviceService', DeviceService); 

/* @ngInject */ 

function DeviceService($injector, $q) { 
    // inject another service 
    var ServiceUser = $injector.get('ServiceUser'); 
    var userDatas = ServiceUser.getUserDatas(); 
    console.log('info ' + userDatas.info); 
    var service = { 
     getMarkers: getMarkers 
    }; 
    return service; 

    function getMarkers() { 
     // firebase Promise 
     userDatas.$loaded().then(function() { 
      var defer = $q.defer(); 
      var devices = userDatas.ownDevices; 
      console.log('Device ' + devices); 
      var markers = []; 
      angular.forEach(devices, function (key) { 
       var devicesData = firebase.database().ref().child('device/' + key).once('value'); 
       devicesData.then(function (data) { 
        var deviceObj = data.val(); 
        markers.push({ 
         lat: deviceObj.lat, 
         lng: deviceObj.lng 
        }); 
       }); 
      }); 
      $q.all(markers).then(function() { 
       // 
       console.log('markers ' + JSON.stringify(markers)); 
      }); 
      return defer; 
     }); 
    } 
}})(); 

おかげ

答えて

0

あなたのコード内markers.push()のでmarkersあなたは$q.all(markers)を呼び出すときに空になるだろう、あなたは$q.all(markers)を呼び出した後、長い起ころうとしています。

私はあなたがそうのようにこの問題を解決することができるはずだと思う:

function getMarkers() { 
    // firebase Promise 
    return userDatas.$loaded().then(function() { 
     var devices = userDatas.ownDevices; 
     console.log('Device ' + devices); 

     var markers = devices.map(function (key) { 
      var devicesData = firebase.database().ref().child('device/' + key).once('value'); 

      return devicesData.then(function (data) { 
       var deviceObj = data.val(); 

       return { 
        lat: deviceObj.lat, 
        lng: deviceObj.lng 
       }; 
      }); 
     }); 

     return $q.all(markers) 
      // the next three lines are not necessary and are just for debugging 
      .finally(function (retrievedMarkers) { 
       console.log('markers ' + JSON.stringify(retrievedMarkers)); 
      }); 
    }); 
} 

私はまた、あなたが1つの関数にあまりやっていないように、このリファクタリングを示唆している:用

// returns a promise for one set of coordinates 
function getDeviceCoordinates(deviceKey) { 
    var devicesData = firebase.database().ref().child('device/' + key).once('value'); 

    return devicesData.then(function (data) { 
     var deviceObj = data.val(); 

     return { 
      lat: deviceObj.lat, 
      lng: deviceObj.lng 
     }; 
    }); 
} 

function getMarkers() { 
    // firebase Promise 
    return userDatas.$loaded().then(function() { 
     var devices = userDatas.ownDevices; 
     console.log('Device ' + devices); 

     var markers = devices.map(getDeviceCoordinates); 

     return $q.all(markers) 
      // the next three lines are not necessary and are just for debugging 
      .finally(function (retrievedMarkers) { 
       console.log('markers ' + JSON.stringify(retrievedMarkers)); 
      }); 
    }); 
} 
+0

感謝をあなたの助け。私は2つのソリューションを試しましたが、2つのケースでは、マーカーは確かです。 –

+0

@YseultFran「マーカー」が未定義になることはありません。どのようにアクセスしようとしているのか教えてください。 – JLRishe

+0

私のコントローラには、 'vm.markers = DeviceService.getMarkers();' –