Ответ 1
Это возможно и даже довольно легко!
Хорошо, если мы посмотрим, как Angular работа promises, нам нужно получить Bluebird до $evalAsync
где-то, чтобы получить то же самое поведение.
Если мы это сделаем, тот факт, что обе реализации Promises/A + совместимы, мы можем объединить между $q
кодом и Bluebird код, то есть мы можем свободно использовать все функции Bluebird в Angular.
Bluebird предоставляет эту функциональность, используя Promise.setScheduler
:
// after this, all promises will cause digests like $q promises.
function trackDigests(app) {
app.run(["$rootScope",function ($rootScope) {
Promise.setScheduler(function (cb) {
$rootScope.$evalAsync(cb);
});
}]);
}
Теперь нам нужно добавить:
trackDigests(app);
после строки var app = ...
, и все будет работать так, как ожидалось. Для бонусных очков поставьте Bluebird в службу, чтобы вы могли ее использовать, а не использовать в глобальном пространстве имен.
Ниже приведено [ Fiddle].
Обратите внимание, что помимо всех функций, которые Bluebird имеет над $q
, одним из наиболее важных является то, что Bluebird не будет запускать $exceptionHandler
, но вместо этого будет автоматически отслеживать необработанные отклонения, поэтому вы можете throw
свободно с Bluebird promises, и Bluebird выяснит их. Более того, вызов Promise.longStackTraces()
может помочь с отладкой много.