私は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
避けたい。
(私は$ qがそれをするのでそれが可能であることを知っています)
私が入手したBluebird 2.0を使用しています here 。
まあ、 Angular自身のプロミスがどのように機能するか を見ると、まったく同じ動作をするために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をサービスに配置して、グローバル名前空間で使用するのではなく注入できるようにします。
これはこの動作を示す[ Fiddle ]です。
Bluebirdが_$q
_よりも優れているすべての機能に加えて、Bluebirdがnot_$exceptionHandler
_を実行する代わりに、未処理の拒否を自動的に追跡するため、Bluebirdの約束を自由にthrow
でき、Bluebirdはそれらを理解します。さらに、Promise.longStackTraces()
を呼び出すと、多くのデバッグに役立ちます。
ライブラリ Angular bluebird promises は、$q
サービスをbluebird
に置き換えます。 $http
もbluebirdを通過します