Что касается $q
, то обещания идут, в сравнении с другими нет большой поведенческой разницы. Основное преимущество второго подхода заключается в том, что он использует тот же стиль, что и нативные обещания, и он прекрасно содержит логику для решения обещания вместо того, чтобы иметь свободную отложенную завивку (это, вероятно, является одной из причин, по которым национальные обещания шли с последний style).
Я ошибочно сказал, что второй подход поймает синхронные ошибки в переданной функции и преобразует их в отклоненное обещание. Это верно для местных обещаний, обещаний Q, обещаний Bluebird и, возможно, других, но это неверно для $q()
. $q
просто обработает ошибку как неперехваченную ошибку и зарегистрирует ее на консоли.
Вот пример, используя обещания Bluebird, о том, что я описывал. Это отличный повод, чтобы использовать последний стиль, если вы используете другие обещания, чем $q
:
function queryValue(callback) {
throw new Error("Not implemented yet!!!");
}
function makeConstructorPromise() {
return new Promise(function(resolve) {
queryValue(function(value) {
resolve(value);
});
});
}
function makeDeferredPromise() {
let deferred = Promise.defer();
queryValue(function(value) {
deferred.resolve(value);
});
return deferred.promise;
}
makeConstructorPromise()
.catch(function(error) {
console.error('caught the constructed promise error!', error);
});
makeDeferredPromise()
.catch(function(error) {
// not caught
console.error('caught the deferred promise error!', error);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.min.js"></script>
Отложенный подход старомоден и может иметь практическое применение в конкретных случаях, но 99 % времени, подход конструктора - путь.
Это безопаснее (в большинстве обещаний) и согласуется с тем, как работает ES6.
https://docs.angularjs.org/api/ng/service/$q Цель отложенного объекта заключается в том, чтобы выставить связанный экземпляр Promise, а также API, которые могут использоваться для сигнализации успешного или неудачного завершения, а также статуса задачи. – Noctisdark