首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Angular,绑定在使用Promise.catch时不起作用

Angular,绑定在使用Promise.catch时不起作用
EN

Stack Overflow用户
提问于 2017-01-30 17:36:42
回答 1查看 106关注 0票数 0

我使用Auth0进行登录,我有以下代码:

代码语言:javascript
复制
$scope.login = function () {
        $scope.loginFailed = false;
        $scope.loading = true;

        loaderService.show();

        let credentials = {
            email: $scope.email,
            password: $scope.password
        };
        principal.signin(credentials)
            .then(() => {
                $state.go('main.index');
            })
            .catch(e => {
                showError(e.error_description);
                loaderService.hide();
            });
    };

principle服务包含登录功能:

代码语言:javascript
复制
signin(credentials) {
        return new Promise((resolve, reject) => {
            this.auth.signin({
                connection: 'Username-Password-Authentication',
                email: credentials.email,
                sso: false,
                password: credentials.password,
                authParams: {
                    scope: 'openid name email'
                }
            }, this.onLoginSuccess.bind(this, resolve, reject), this.onLoginFailed.bind(this, reject));
        });
    }

因此,正如您所看到的,我创建了promise并将resolve/reject传递给Auth0回调。回调非常简单:

代码语言:javascript
复制
onLoginSuccess(resolve, reject, profile, token) {
        let userData = this.collectData(profile);
        ... store token
        return this.syncCurrent(userData) //request to server
            .then(() => {
                return resolve();
            })
            .catch(() => {
                this.signOut();
                return reject();
            });
}

onLoginFailed(reject, error) {
        return reject(error.details);
}

那么,让我们回到第一个代码片段。代码如下:

代码语言:javascript
复制
principal.signin(credentials)
                .then(() => {
                    $state.go('main.index');
                })
                .catch(e => {
                    showError(e.error_description);
                    loaderService.hide();
                });

当我使用正确的电子邮件/密码,重定向工作正常,我看到主页。但是,当我使用错误的电子邮件/密码时,我看到执行了catch块,我看到调试器中的值发生了更改,但我没有看到错误块,加载图像也没有消失。这在html中没有问题,因为我现在正在重构代码,上面的所有代码都在一个文件中,我没有使用promises,一切都运行得很好。我试图在principal.signin(credentials)函数之前执行showError方法,只是为了测试,但我看到了错误,加载图像是隐藏的。所以,我认为问题出在promises和catch block上,但我不知道在哪里。

PS。showError如下所示:

代码语言:javascript
复制
function showError(errorText) {
        $scope.loading = false;
        $scope.loginFailed = true;
        $scope.loginErrorMessage = errorText;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-30 18:15:50

这个问题的原因是使用了非角度的承诺。Angular承诺,即$q服务,负责在解析后调用摘要周期。摘要循环是在Angular 1中实现的变化检测,即通知观察者并使操作发生。

使用$q解决了这个问题。

代码的then部分之所以能够工作,可能是因为它调用了$state.go(),而后者又调用了摘要循环。catch部分没有,所以更改从来没有机会解雇观察者。

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

https://stackoverflow.com/questions/41932647

复制
相关文章

相似问题

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