我如何使用蓝鸟与Angular?

我尝试使用蓝鸟的承诺:

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; 

[ 小提琴 ]

然而,无论我尝试了什么,它仍然保持"$q promises" ,并没有更新。 除了我添加了一个手动的$scope.$apply ,我宁愿避免。

我如何让Bluebird与AngularJS一起工作?

(我知道这是可能的,因为$ q)

我正在使用Bluebird 2.0,

这是可能的,甚至很容易!

那么,如果我们看看Angular自己的承诺是如何工作的 ,那么我们需要在某处获得Bluebird到$evalAsync以获得完全相同的行为。

如果我们这样做,两个实现都符合Promises / A +的事实意味着我们可以在$q代码和Bluebird代码之间进行交互,这意味着我们可以自由地在Angular代码中使用Bluebird的所有特性。

Bluebird公开了它的Promise.setSchedulerfunction:

 // 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放在一个服务中,这样你就可以注入它,而不是在全局命名空间中使用它。

这是一个[ 小提琴 ]说明这种行为。

请注意,除了Bluebird超过$q所有function之外,其中一个更重要的特性是Bluebird 不会运行$exceptionHandler ,而是会自动跟踪未处理的拒绝,所以您可以随意使用Bluebird的承诺,Bluebird将会发现它们。 此外调用Promise.longStackTraces()可以帮助debugging很多。

图书馆蓝鸟的承诺以bluebird代替$q服务。 $http也运行通过蓝鸟