我尝试将Angular与Bluebird Promise一起使用:
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]但是,无论我尝试了什么,它都会保持
"$q promises"
并没有更新。除非我添加了我希望避免的手动$scope.$apply
。如何让Bluebird与AngularJS一起使用?
(我知道这是可能的,因为$ q可以做到)
我正在使用here的Bluebird 2.0。
最佳答案
这是可能的,甚至很容易!
好吧,如果我们看看Angular's own promises work的方式,我们需要将Bluebird替换为$evalAsync
以便获得完全相同的行为。
如果这样做,那么两个实现都符合Promises/A+的事实意味着我们可以在$q
代码和Bluebird代码之间进行互操作,这意味着我们可以在Angular代码中自由使用Bluebird的所有功能。
Bluebird通过 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);
});
}]);
}
现在我们要做的就是添加一个:trackDigests(app);
在var app = ...
行之后,并且一切都会按预期进行。为了获得奖励积分,请将Bluebird放入服务中,以便您可以注入(inject)它,而不是在全局 namespace 上使用它。这是[Fiddle],说明了此行为。
请注意,除了Bluebird具有
$q
的所有功能之外,更重要的功能之一是Bluebird不会运行$exceptionHandler
,而是自动跟踪未处理的拒绝,因此您可以使用Bluebird Promise自由地throw
,Bluebird会解决它们。此外,调用Promise.longStackTraces()
可以大大帮助调试。关于javascript - 如何在Angular中使用Bluebird?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23984471/