2013-06-25 3 views
1

сегодня у меня есть вопрос, который я действительно не понимаю :)угловатая, обещание и асинхронная функция

Я написал угловую службу, называют мой апи, переформатированием результата и привести эти данные в другую функцию в угловой контроллер. Я делаю это так много раз, но сегодня что-то идет не так.

переформатирования-результат и данных, доступ к контроллеру не то же самое, и я не знаю (может понять), почему: D

Это код услуги:

myApp.factory('apiService', function($http) { 
var myService = { 
    getMunicipalityAsync : function(id) { 
     var promise = null; 
     promise = $http({ 
      method: 'GET', 
      url: '/api2/cc/municipality/' + id 
     }).success(function(response) { 
      var r = { 
       'success': true, 
       'data': response.data 
      }; 
      console.debug(r, 'return this'); 
      return r; 
     }).error(function(data, status, headers, config) { 
      logError("[apiService], getMunicipalityAsync() error, with status: " + status); 
     }); 
     return promise; 
    } 
} 
return myService; 
}); 

И это код в угловой контроллер.

apiService.getMunicipalityAsync($scope.conf.geoarea).then(
    function(d) { 
     console.debug(d, 'return from service'); 
    }, function(error) { 
     alert('error'); 
    }); 

отладочной Данные не то же самое :( look

Благодаря

ответ

3

Два метода успеха и ошибки являются конкретные методы $ HTTP, как описано в документации в: http://docs.angularjs.org/api/ng. $ http

Эти методы успеха и ошибки получают 4 параметра: данные, состояние, заголовки и конфиг.Но обычные методы обещания получают только объект. В вашем коде вы действительно можете увидеть, что параметр «d», который вы получаете в then-function getMunicipalityAsync, содержит данные атрибутов, состояние, заголовки и конфигурацию. Это также прямо указано в документах:

«Поскольку возвращаемое значение вызова функции $ http является обещанием, вы также можете использовать метод then для регистрации обратных вызовов, и эти обратные вызовы получат один аргумент - объект, представляющий ответ. Дополнительную информацию см. в описании и описании типа API ниже ».

apiService.getMunicipalityAsync($scope.conf.geoarea).then(
    function(d) { 
     console.debug(d.data, 'return from service'); 
    }, function(error) { 
     alert('error'); 
    }); 

Но я думаю, что у вас есть неправильное понимание. Если вы хотите получить доступ к расширенной информации в контроллере, то вы должны создать новое обещание, которое вам нужно «решить» с улучшенными данными в методе успеха:

myApp.factory('apiService', function($http, $q) { 
var myService = { 
    getMunicipalityAsync : function() { 
     var deferred = $q.defer(); 

     $http({ 
      method: 'GET', 
      url: 'http://192.168.1.151/temp/angulartest/data/data.json' 
     }).success(function(response) { 
      var result = { 
       'success': true, 
       'data': response.data 
      }; 
      console.debug(result, 'return this'); 
      deferred.resolve(result); 
     }).error(function(data, status, headers, config) { 
      logError("[apiService], getMunicipalityAsync() error, with status: " + status); 
      deferred.reject(); 
     }); 
     return deferred.promise; 
    } 
} 
return myService; 
}); 

Тогда вы можете получить доступ к расширенной информации непосредственно в контроллере:

apiService.getMunicipalityAsync().then(
    function(enhancedData) { 
     console.debug(enhancedData, 'return from service'); 
    }, function(error) { 
     alert('error'); 
    }); 
+0

Согласно спецификации, 'затем' должен вернуть новое обещание, так что я думаю, что вы могли бы сделать что-то вроде' возвращение $ HTTP (..), а затем (transformOutputFunc) '. – Alxandr

Смежные вопросы