Как отправлять только response.data на мои контроллеры вместо полного ответа при использовании $ http.jsonp?

0

У меня есть решение, которое вызывает вызов webapi для передачи данных различным контроллерам. Но он всегда посылает полный ответ с заголовками HTTP/etc на контроллеры, а не только с данными. Поэтому мои контроллеры должны получить доступ к следующим данным:

response.data.myObj1 и response.data.myObj2

Мне просто нужны data.myObj1 и data.myObj2.

Сейчас мое решение выглядит так:

resolve: {
          eventData: function ($stateParams, $http) {
               return $http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK');
               }
            }

Но я также пробовал это:

resolve: {
                eventData: function ($stateParams, $http) {
                    $http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK').success(function(data){
        return data;
      });
                }
            }

и это:

resolve: {
                eventData: function ($stateParams, $http) {
                    $http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK').then(function(response){
        return response.data;
      });
                }
            }

Последние два дают мне неопределенные ошибки, когда я пытаюсь получить доступ к любому из объектов объекта данных, отправленных контроллерам (eventData).

  • 0
    Почему вы удалили return $http во вторых двух примерах ?!
  • 0
    Потому что я пытаюсь вернуть только данные, а не весь ответ.
Показать ещё 4 комментария
Теги:

1 ответ

1
Лучший ответ

$http возвращает обещания. Это то, что все синтаксис .then, .catch.

Это то, что позволяет вам запускать код, когда обещание разрешается и что облегчает способность цепочки.

Вы управляете данными, проходящими через эту цепочку обещаний, поэтому внутри каждого .then() когда обещание разрешается. Это означает, что обещание может быть создано и возвращено, .then может быть присоединена к нему, но он не будет "активирован" до тех пор пока он решает. В вашем случае возвращается AJAX. После того, как он будет разрешен, он запускает все ваши. .then отправляет данные от одного к другому в цепочке, позволяя вам действовать.

Поэтому, чтобы ответить на ваш вопрос, вы перехватите свою цепочку обещаний, прежде чем она выйдет из службы и будет манипулировать данными, прежде чем она вернется к вашему контроллеру.

Так что почти так же, как ваш последний фрагмент кода, за исключением одного бита, дополнительный возврат до $http.

resolve: {
  eventData: function($stateParams, $http) {
    return $http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK').then(function(response) {
      return response.data;
    });
  }
}

Это возвращение очень важно, и вы не возвращаете весь объект ответа в этот момент, так как ваш запрос AJAX не будет разрешен к тому времени. то, что вы делаете, возвращает объект обещания с вашим прикованным .then().

Когда AJAX вернется, он решит обещание и запустит ваш .then() уменьшив ваш объект ответа и отправив его на ваш код вызова, в этом случае контроллер.

Надеюсь, что поможет объяснить, что происходит.

  • 0
    Отличное объяснение! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню