首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Angular中使用Bluebird?

如何在Angular中使用Bluebird?
EN

Stack Overflow用户
提问于 2014-06-02 05:06:09
回答 2查看 9K关注 0票数 45

我尝试使用Angular和Bluebird promises:

HTML:

代码语言:javascript
复制
<body ng-app="HelloApp">
    <div ng-controller="HomeController">{{name}} {{also}}</div>
</body>

JS:

代码语言:javascript
复制
// 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

如何让蓝鸟与AngularJS协同工作?

(我知道这是可能的,因为$q做到了)

我使用的是Bluebird 2.0,它是我得到的here

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-02 05:06:09

这是可能的,甚至很容易!

好吧,如果我们看看Angular's own promises work是如何实现的,我们需要让Bluebird访问某个地方的$evalAsync,以便获得完全相同的行为。

如果我们这样做,这两个实现都是Promises/A+兼容的,这意味着我们可以在$q代码和蓝鸟代码之间进行互操作,这意味着我们可以在Angular代码中自由地使用蓝鸟的所有功能。

Bluebird通过其Promise.setScheduler功能公开了此功能:

代码语言:javascript
复制
// 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);
        });
    }]);
}

现在我们要做的就是添加一个:

代码语言:javascript
复制
trackDigests(app); 

var app = ...行之后,一切都将按预期工作。为了获得额外的好处,将Bluebird放在服务中,这样您就可以注入它,而不是在全局名称空间上使用它。

下面是一个说明此行为的[]。

请注意,除了蓝鸟在$q上拥有的所有功能之外,其中一个更重要的功能是,蓝鸟不会运行$exceptionHandler,而是会自动跟踪未处理的拒绝,因此您可以自由地使用蓝鸟承诺的throw,蓝鸟会解决这些问题。此外,调用Promise.longStackTraces()可以对调试有很大帮助。

票数 61
EN

Stack Overflow用户

发布于 2016-11-17 20:52:57

Library Angular bluebird promisesbluebird代替了$q服务。$http还通过bluebird运行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23984471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档