2013-06-24 2 views
6

Mark Dalgleish написал nice little article о том, как использовать обещания в виде AngularJS. Некоторые люди задавали вопросы об этом в комментариях, но Марк не ответил им (пока). Потому что я прошу меня тот же вопрос, я буду просить о StackOverflow вместо того, чтобы получить ответ:Использование обещаний в AngularJS Просмотров

  1. Если вы используете обещания во взглядах, как я могу справиться с «загрузкой»/«ожидание» указания, потому что они асинхронные? Есть ли у обещания что-то вроде «разрешенного» или «внутригосударственного» имущества?

  2. Как обращаться с ошибками? Обычно они возникали во втором обратном вызове, но если я использую обещание непосредственно в представлении, я не обрабатываю этот случай. Есть ли другой способ?

спасибо.

+0

только что прочитал около $ q на угловых официальных документах, и на ваши два вопроса ответят –

+2

Не похоже, что #rtfm помогает здесь, потому что я не хочу использовать обещание программно, но изнутри представления, как описано в вопросе/статье. Это, похоже, не является частью документов. – Pipo

ответ

13

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> 

все будет работать, как и ожидалось, что может стать неожиданностью.

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

+0

Благодарим вас за подробный ответ. – Pipo

+2

«обещания, возвращаемые функцией, не будут решены правильно», но «все будет работать так, как ожидалось» - разве это не должно быть «не будет»? ;) – schellmax