Comment puis-je utiliser Bluebird with Angular?

J'ai essayé d'utiliser les promesses Angular with Bluebird:

HTML:

<body ng-app="HelloApp"> <div ng-controller="HomeController">{{name}} {{also}}</div> </body> 

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; 

[ Fiddle ]

Cependant, peu importe ce que j'ai essayé, il a continué à rester "$q promises" et n'a pas été mis à jour. Sauf si j'ai ajouté un $scope.$apply ce que je préfère éviter.

Comment puis-je obtenir Bluebird pour travailler avec AngularJS?

(Je sais que c'est possible puisque $ q le fait)

J'utilise Bluebird 2.0 que j'ai trouvé ici .

C'est possible, et même assez facile!

Eh bien, si on regarde comment les promesses de Angular fonctionnent , nous devons obtenir Bluebird à $evalAsync quelque part afin d'obtenir exactement le même comportement.

Si nous faisons cela, le fait que les deux implémentations sont compatibles avec Promises / A + signifie que nous pouvons interopiner entre le code $q et le code Bluebird, ce qui signifie que nous pouvons utiliser toutes les fonctionnalités de Bluebird dans le code Angulaire librement.

Bluebird expose cette fonctionnalité, avec sa fonctionnalité 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); }); }]); } 

Maintenant, tout ce que nous avons à faire est d'ajouter un:

 trackDigests(app); 

Line after the var app = ... line, et tout fonctionnera comme prévu. Pour les points bonus, placez Bluebird dans un service afin que vous puissiez l'injecter plutôt que de l'utiliser sur l'espace de noms global.

Voici un [ Fiddle ] illustrant ce comportement.

Notez que, outre toutes les fonctionnalités, Bluebird a plus de $q , l'un des plus importants est que Bluebird ne fonctionnera pas sur $exceptionHandler , mais permettra automatiquement de suivre les rejets non contrôlés, de sorte que vous pouvez throw librement avec Bluebird promesses et Bluebird va les comprendre. En outre, appeler Promise.longStackTraces() peut aider à déboguer beaucoup.

Bibliothèque Les promesses de Bluebird angulaire remplacent le service $q par bluebird . $http également parcouru Bluebird