【问题标题】:Angular 6 and RxJs 6 display modal if 401如果 401,Angular 6 和 RxJs 6 显示模式
【发布时间】:2018-11-14 16:03:33
【问题描述】:

当我发送请求并且响应为 401 状态时,我想显示模式框(带有用户和密码)以重新登录用户,然后重新发送原始请求。

我发现以前版本的 RxJs 的帖子非常有趣,我无法将其更新到新版本 How to catch an error on a Request, then open a modal, then retry when modal closes with RxJS

当我有 401 时,我的代码会显示模式,但同时它会重新发送我的请求并且它不会等待关闭操作。

你能帮帮我吗?

return this.http.get<Object>('http://localhost/test', httpOptions).
        pipe(
            tap(),
            retryWhen(errors =>
                errors.pipe(
                    tap(val => {
                        if (val.status === 401) {
                            let closedSubject = new Subject();
                            let modalRef = this.modalService.open(ModalLoginComponent);
                            modalRef.result.then((data) => {
                                console.log('closed me');
                                closedSubject.next(val);

                            }, (reason) => {
                            });
                            return <any>closedSubject;
                        }
                        else {
                            return Observable.throw(val.json());
                        }
                    })
                )
            )
        );

【问题讨论】:

  • 您想使用catchError 运算符而不是retryWhen
  • 使用 catchError 我无法在模式关闭操作后重试请求。

标签: angular rxjs6


【解决方案1】:

我用 AngularJs 尝试了这个,我找到了一个解决方案,但我无法在 Angular 2+ 中重现它 你有解决方案在新的 Angular 版本中重写它吗?

$httpProvider.interceptors.push(function ($injector, $q) {
    var modalInstance;
    return {
        'response': function (response) {
            return response;
        },
        'responseError': function (response) {
            var rootUrl = 'http://localhost/';
            // If this not login request and 401
            if(response.config.url != rootUrl+'login/' && response.status == 401) {
                var deferred = $q.defer();
                var $http = $injector.get('$http');
                var $uibModal = $injector.get('$uibModal');
                // Open login modal
                modalInstance = $uibModal.open({
                    templateUrl: rootUrl+'public/js/views/modalLogin.html',
                    controller: 'DialogCtrl',
                    keyboard: false,
                    backdrop: 'static'
                });

                // Modal result
                modalInstance.result.then(function () {
                    $injector.get("$http")(response.config).then(function(resp) {
                        deferred.resolve(resp);
                    },function(resp) {
                        deferred.reject();
                    });
                });
                return deferred.promise;
            }
            return $q.reject(response);
        }
    };
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 2018-10-15
    • 2018-12-19
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多