我如何使用蓝鸟与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.setScheduler
function:
// 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
也运行通过蓝鸟