Использование return $q.when в контексте данных Hot Towel Angular

Я создал веб-приложение, используя шаблон Hot Towel Angular, и хочу добавить сервисную функцию в «контекст данных».

Код:

(function () {
    'use strict';

    var serviceId = 'datacontext';
    angular.module('app').factory(serviceId, ['common', '$http', datacontext]);

    function datacontext(common, $http) {
        var $q = common.$q;

        var service = {
            getFunctions: getFunctions
        };

        return service;

        function getFunctions() {
            var f = [];
            $http({
                method: 'GET',
                url: 'https://api.github.com/users/google/repos',
                contentType: 'application/json; charset=utf-8'
            })
            .success(function (data, status, headers, config) {
                f = data;
                console.log('f=*' + f + '*');
            })
            .error(function (data, status, headers, config) {
                alert('error!');
            });

            return $q.when(f);
        }
    }
})();


Я вижу, что консоль показывает некоторые объекты:

f=*[object Object],[object Object],[object O...

Но при использовании этого в моем файле functionController.js:

function getFunctions() {
  return datacontext.getFunctions().then(function (data) {
    console.log('data=*' + data + '*');
    return vm.functions = data;
  });
}

Для данных задано значение undefined.

Я что-то упустил, помогите определить ошибку.


person Stef Heyenrath    schedule 03.01.2014    source источник
comment
Ваш $q.when(f) просто оборачивает пустой массив [], который является текущим значением f при выполнении возврата, в обещание. Затем это обещание немедленно разрешается с этим значением, т. Е. Ваш тогда-обратный вызов вызывается с data=[].   -  person Miichi    schedule 04.01.2014
comment
Хорошо, я понимаю, но какое решение заставить эту работу работать?   -  person Stef Heyenrath    schedule 04.01.2014


Ответы (1)


Решение:

Функция getFunctions в datacontext должна возвращать объект обещания $http, например:

function getFunctions() {
  return $http.get('https://api.github.com/users/google/repos')
    .error(function (data, status, headers, config) {
      alert('error ! : ' + status);
  });
}


А в контроллере вы можете использовать возвращенный объект json следующим образом:

function getRepos() {
  return datacontext.getRepos().then(function (httpResult) {
    vm.repos = httpResult.data;
  });
}
person Stef Heyenrath    schedule 07.01.2014
comment
Это действительно правильный ответ? Для меня возврат обещания $http полностью противоречит цели использования контекстов данных, поскольку он предоставляет потребителю детали реализации доступа к данным. Потребитель будет зависеть от реализации доступа к данным, поэтому вы не сможете использовать стратегию кэширования или подделку без изменения потребителя. На мой взгляд, изначальная идея была хороша, просто плохо реализована. - person Francesc Castells; 21.02.2015