AngularJS: $routeProvider при разрешении $http возвращает объект ответа вместо моего объекта

Я пытаюсь разрешить пару вызовов ajax, чтобы данные, необходимые моему контроллеру, были доступны до его выполнения (и директивы, которую он предоставляет). Порядок выполнения работает, однако вместо того, чтобы возвращать объект, который я создаю, результатом, введенным в мой контроллер, является объект ответа $http:

{
  config: { … },
  data: { … },
  headers: { … },
  status: 200
}

Мой код выглядит примерно так:

app.config([
  '$routeProvider', function($routeProvider)
  {
    $routeProvider
      .when('/path', {
        …,
        "resolve": {
          "data": [
            '$http',
            function($http)
            {
              return $http
                .get('/api/data')
                .success(function(data,status) { return data.rows[0]; })
                .error(function(data,status)   { return false; });
            }
          ]
        }
      });
  }
]);

Я дурак? Разве возвращаемое значение успеха $http не должно быть тем, что возвращает $http?

я тоже пробовал

…
"resolve": {
  "data": [
    '$http',
    function($http)
    {
      var response;
      $http
        .get('/api/data')
        .success(function(data,status) { response = data.rows[0]; })
        .error(function(data,status)   { response = false; });
      return response;
    }
  ]
}

Но затем объект data, введенный в мой контроллер, был неопределенным (я предполагаю, что $http является асинхронным, а resolve не был заблокирован $http, поэтому он вернулся до того, как $http был готов).

P.S. Синхронность $http должна определяться в его объекте опций!!

Решение

app.config([
  '$routeProvider', function($routeProvider)
  {
    $routeProvider
      .when('/path', {
        …,
        "resolve": {
          "data": [
            '$http',
            function($http)
            {
              return $http
                .get('/api/data')
                .then(
                  function success(response) { return response.data.rows[0]; },
                  function error(reason)     { return false; }
                );
            }
          ]
        }
      });
  }
]);

Спасибо указатель Ajay beniwal и Пометить указатель Райкока.

P.S. then() задокументировано в $q страница.


person Jakob Jingleheimer    schedule 17.07.2013    source источник
comment
Вам нужно вернуть обещание. См. stackoverflow.com/questions/11972026/, ответ вики сообщества.   -  person Mark Rajcok    schedule 17.07.2013
comment
Ранее я использовал $http.get('…').then() (который, как мне кажется, является методом $promise), но мне нужны методы success и error (которых я не вижу для then. (Я действительно не хочу устанавливать произвольную задержку/тайм-аут — просто продолжайте, когда придет время). готово, гр).   -  person Jakob Jingleheimer    schedule 17.07.2013
comment
Если ответ есть, почему бы не опубликовать его как реальный ответ?   -  person user1338062    schedule 11.03.2015


Ответы (1)


$http @returns {HttpPromise} Возвращает объект {@link ng.$q promise} со стандартным методом then и двумя специфическими для http методами: success и error. Метод then принимает два аргумента: успех и обратный вызов ошибки, который будет вызываться с объектом ответа. Методы success и error принимают один аргумент — функцию, которая будет вызываться при успешном или неудачном выполнении запроса соответственно. Аргументы, передаваемые в эти функции, представляют собой деструктурированное представление объекта ответа, переданного в метод then. Объект ответа имеет следующие свойства:

person Ajay Beniwal    schedule 17.07.2013
comment
Было бы здорово, если бы в документации был приведен пример использования then и его обратных вызовов :/ - person Jakob Jingleheimer; 17.07.2013
comment
О, есть пример в ‹a href=docs.angularjs.org/api/ng .$q#Описание$q’s docs‹/a› - person Jakob Jingleheimer; 17.07.2013
comment
обещание, которое разрешено или отклонено с помощью возвращаемого значения successCallback, errorCallback (если это значение не является обещанием, в этом случае оно разрешается со значением, которое разрешается в этом обещании с использованием цепочки обещаний). github.com/angular/angular.js/ blob/master/src/ng/q.js#L317 TLDR — верните все, что хотите, из $q.then successCallback/errorCallback, упомянутый выше в Решении выше. - person chemoish; 10.06.2015