我尝试使用 Angular 和 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]
然而,无论我如何尝试,它仍然停留在"$q promises"
并且没有更新。除非我添加了手册$scope.$apply
我宁愿避免。
如何让 Bluebird 与 AngularJS 一起使用?
(我知道这是可能的,因为 $q 做到了)
我正在使用我得到的 Bluebird 2.0here.
这是可能的,甚至非常容易!
好吧,如果我们看看如何Angular 自己的承诺有效,我们需要让蓝鸟$evalAsync
某个地方以获得完全相同的行为。
如果我们这样做,事实上这两个实现都是承诺/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 放入服务中,以便您可以注入它,而不是在全局命名空间上使用它。
这里有一个 [Fiddle] 说明了这种行为。
请注意,除了 Bluebird 拥有的所有功能之外$q
,其中更重要的一点是蓝鸟将not run $exceptionHandler
,而是会自动跟踪未处理的拒绝,因此您可以throw
自由地遵守蓝鸟的承诺,蓝鸟会解决这些问题。而且还打电话Promise.longStackTraces()
可以帮助调试很多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)