Como eu uso o Bluebird com Angular?

Eu tentei usar Angular com promises Bluebird:

HTML:

 
{{name}} {{also}}

JS:

 // javascript var app = angular.module('HelloApp', []); app.controller("HomeController", function ($scope) { var p = Promise.delay(1000).then(function () { $scope.name = "Bluebird!"; console.log("Here!", $scope.name); }).then(function () { $scope.also = "Promises"; }); $scope.name = "$q"; $scope.also = "promises"; }); window.app = app; 

[ Violino ]

No entanto, não importa o que eu tentei, manteve-se "$q promises" e não atualizou. Exceto se eu adicionei um $scope.$apply manual, $scope.$apply que eu prefiro evitar.

Como obtenho o Bluebird para trabalhar com o AngularJS?

(Eu sei que é possível, já que $ q faz isso)

Estou usando o Bluebird 2.0, que cheguei aqui .

Isso é possível e até mesmo fácil!

Bem, se observarmos como as próprias promises do Angular funcionam , precisamos levar o Bluebird para o $evalAsync em algum lugar, a fim de obter exatamente o mesmo comportamento.

Se fizermos isso, o fato de ambas as implementações serem compatíveis com Promises / A + significa que podemos interoperar entre o código $q e o código Bluebird, o que significa que podemos usar livremente todos os resources do Bluebird no código Angular.

O Bluebird expõe essa funcionalidade, com sua funcionalidade 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); }); }]); } 

Agora tudo o que precisamos fazer é adicionar um:

 trackDigests(app); 

linha após o var app = ... linha, e tudo vai funcionar como esperado. Para pontos de bônus, coloque o Bluebird em um serviço para que você possa injetá-lo em vez de usá-lo no namespace global.

Aqui está um [ Fiddle ] ilustrando esse comportamento.

Note que além de todos os resources que o Bluebird tem acima de $q , um dos mais importantes é que o Bluebird não rodará $exceptionHandler , mas automaticamente rastreará rejeições não tratadas, assim você pode throw livremente com promises Bluebird e o Bluebird irá descobri-las. Além disso, chamar Promise.longStackTraces() pode ajudar muito na debugging.

A promises do bluebird angular da biblioteca substitui o serviço de $q com o bluebird . $http também é executado através do bluebird