Подтвердить что ты не робот

Как использовать Bluebird с Angular?

Я попытался использовать Angular с Bluebird promises:

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.0, который я получил здесь.

4b9b3361

Ответ 1

Это возможно и даже довольно легко!

Хорошо, если мы посмотрим, как Angular работа promises, нам нужно получить Bluebird до $evalAsync где-то, чтобы получить то же самое поведение.

Если мы это сделаем, тот факт, что обе реализации Promises/A + совместимы, мы можем объединить между $q кодом и Bluebird код, то есть мы можем свободно использовать все функции Bluebird в Angular.

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 не будет запускать $exceptionHandler, но вместо этого будет автоматически отслеживать необработанные отклонения, поэтому вы можете throw свободно с Bluebird promises, и Bluebird выяснит их. Более того, вызов Promise.longStackTraces() может помочь с отладкой много.

Ответ 2

Библиотека Angular bluebird promises заменяет службу $q bluebird. $http также запускается через bluebird