Observable <boolean>方法在catch块后返回null

时间:2017-09-09 07:06:37

标签: javascript angular typescript

鉴于此方法: 为什么登录状态为 null 而不是 false

// this method is called below, I am attempting to return only true or false.
isLoggedIn(): Observable<boolean> {
    return this
        .loadToken()
        .catch(e => {
            this.logger.info(e); // this is being logged...
            this.token = null;
            return Observable.of(false); // and I specifically return false.
        })
        .map(_ => this.token && this.token.access_token.length > 0);

这里

调用
return this.authService.isLoggedIn().map(_ => {
    this.logger.info(`authorisation guard :: login status ${_}`);
    if (_)
        return true;
    this.router.navigate(["login"]);
    return Observable.of(false);
}).catch(_ => {
    this.logger.info(`authorisation guard :: login error ${_}`);
    this.router.navigate(["login"]);
    return Observable.of(false);
});

记录以下内容:

2017-09-09T06:55:46Z [INFO] authorisation guard :: login status null

我期待

2017-09-09T06:55:46Z [INFO] authorisation guard :: login status false

1 个答案:

答案 0 :(得分:3)

您已将catch放在map

之前
isLoggedIn(): Observable<boolean> {
return this
    .loadToken()
    .catch(e => {
        this.logger.info(e);
        this.token = null;
        return Observable.of(false);
    })
    .map(_ => this.token && this.token.access_token.length > 0);

这意味着当loadToken中发生错误时,它将被catch捕获,并且将使用catch运算符返回的observable恢复可观察链:{{1 }}

因此,Observable.of(false)将被传递到false,在此处将被忽略,并且map的值将被返回 - 因为它将是this.token并且将失败逻辑表达式中的第一个测试。

您很可能希望将null放在catch之后。