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.
(Je sais que c'est possible puisque $ q le fait)
J'utilise Bluebird 2.0 que j'ai trouvé ici .
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