AngularJS:如何在服务和工厂之间传递数据?

时间:2016-07-22 11:14:09

标签: angularjs ajax ionic-framework

我有工厂和服务。工厂为getDriversData,服务为collectDrivers。在服务中,我需要从JSON文件中获取一些数据,因此我使用了$http.get。我需要将数据从服务发送到工厂,因为我将在工厂中对数据进行一些处理。代码如下:

.service('collectDrivers', function($http) {

     // Get JSON
     $http.get('js/bib.json').success(function(response) {
         console.log('ENTERING HTTP GET IN collectDrivers');
         console.log('RESPONSE DALAM collectDrivers', response);

         // Put all response data into globalArray using loop
         for(i = 0; i < response.length; i++) {

             // If type is driver, put the uid in globalArray
             if(response[i].type == 'driver') {
                 globalArray[i] = response[i].uid;
             }
         }
     });
     return globalArray;
})

.factory('processDriversData', function(collectDriversData) {
    // I will be doing some processing in the collected data
    // so I want to make sure it is already available in the
    // globalArray
    console.log('Content of globalArray: ', globalArray);
})

问题是,globalArray尚未填写。但是,如果我尝试在控制器中调用globalArray,那么数据就在那里。那么,如何将数据从服务传递到工厂?我是新手,所以如果我错了,请告诉我正确的方法。

1 个答案:

答案 0 :(得分:0)

无需全球化。由于异步操作,您需要回调/承诺。下面是使用回调:

服务

.service('collectDrivers', function($http) {

  function getData(callbacl) {
    var globalArray = [];
    // Get JSON
    $http.get('js/bib.json').success(function(response) {
      console.log('ENTERING HTTP GET IN collectDrivers');
      console.log('RESPONSE DALAM collectDrivers', response);

      // Put all response data into globalArray using loop
      for (i = 0; i < response.length; i++) {

        // If type is driver, put the uid in globalArray
        if (response[i].type == 'driver') {
          globalArray[i] = response[i].uid;
        }
      }
      return callback(globalArray);
    });
  }

})

工厂:

.factory('processDriversData', function(collectDriversData) {
  var globalArray;
  collectDriversData.getData(function(data){
          globalArray = data;
          console.log('Content of globalArray: ', data);  
  })

})