У меня есть решение, которое вызывает вызов 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).
$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()
уменьшив ваш объект ответа и отправив его на ваш код вызова, в этом случае контроллер.
Надеюсь, что поможет объяснить, что происходит.
return $http
во вторых двух примерах ?!