EDIT: по угловому v1.2 resolution of promise in views is not activated by default.
Автоматическое разрешение обещаний в представлении сначала выглядит как удобный инструмент, но у него есть ряд ограничений, которые необходимо тщательно понимать и оценивать. Самая большая проблема с этим подходом заключается в том, что именно AngularJS добавит обратные вызовы к обещанию, и мы мало контролируем его.
Ответ на ваши вопросы:
1) Как указано, что в конечном счете AngularJS, который добавит обратные вызовы успеха/ошибки, поэтому мы не имеем много контроля здесь. Что вы можете сделать, так это превратить оригинальное обещание в обычное, которое будет отслеживать разрешение. Но этот вид ловкости цели для экономии нескольких нажатий клавиш. И нет, нет таких вещей, как «разрешено». Короче говоря, нет универсального механизма отслеживания прогресса, который бы работал для всех обещаний. Если ваши обещания - $http
- вы можете использовать перехватчики или pendingRequests
для отслеживания запроса.
2) Вы не можете. Еще раз, AngularJS добавляет обработчик внутри сервиса $parse
, и он выглядит так: promise.then(function(val) { promise.$$v = val; });
(см. Код here). Вы можете видеть, что добавлен только обратный вызов успеха, поэтому все сбои будут игнорироваться молча.
Это не единственные ограничения автоматического разрешения обещаний в представлении. Другая проблема заключается в том, что обещания, возвращаемые функцией, не будут разрешены правильно. Например, если вы бы переписать пример так:
myModule.controller('HelloCtrl', function($scope, HelloWorld) {
$scope.messages = function() {
return HelloWorld.getMessages();
}
});
и попытаться использовать следующую разметку:
<li ng-repeat="message in messages()"></li>
все будет работать, как и ожидалось, что может стать неожиданностью.
Вкратце: хотя автоматическое разрешение обещаний может показаться удобным для пользователя ярлыком, оно имеет ряд ограничений и неочевидное поведение. Оцените их внимательно и решите, стоит ли экономить несколько нажатий клавиш.
только что прочитал около $ q на угловых официальных документах, и на ваши два вопроса ответят –
Не похоже, что #rtfm помогает здесь, потому что я не хочу использовать обещание программно, но изнутри представления, как описано в вопросе/статье. Это, похоже, не является частью документов. – Pipo