角度-从带有订阅块的函数返回布尔值

时间:2020-09-16 23:13:12

标签: javascript angular ecmascript-6 observable subscribe

尝试从Angular Service中的以下函数返回布尔值,但无法正常工作,请帮忙!

isActive(id: string): boolean {
        if (!id) {
            return false;
        }
        let userActive = false;
        this.getUsers().subscribe(ActiveUsers => {
            const user = ActiveUsers.find(
                p => p.id === id
            );
            userActive = user ? true : false;
            return userActive;
        });
    }

异步getUsers函数(从API获取其users):

getUsers(): Observable<user[]> {
        
}

2 个答案:

答案 0 :(得分:2)

我建议在您的组件中创建一个变量并将其存储在那里。然后,您可以在需要时使用它。我不知道getUsers是否异步,所以请记住这一点。

isActive(id: string): boolean {
        if (!id) {
            this.isActiveValue = false;
        }
        let userActive = false;
        this.getUsers().subscribe(ActiveUsers => {
            const user = ActiveUsers.find(
                p => p.id === id
            );
            userActive = user ? true : false;
            this.isActiveValue = userActive;
        });
    }

编辑: 好的,那您应该记住一些事情。如果您有一个具有可观察性的方法,则该方法应返回另一个可观察性或不返回任何值,只是为了保持一致。试试这个:

isActive(id: string): Observable<boolean> {
        var subject = new Subject<boolean>();        
        let userActive: boolean = false;
        this.getUsers().subscribe(ActiveUsers => {
            const user = ActiveUsers.find(
                p => p.id === id
            );
            userActive = user ? true : false;
            subject.next(userActive);
        });
        return subject.asObservable();
    }

用法:

isActive(id).subscribe(result => console.log(result));

答案 1 :(得分:1)

因为这是在调用一个可观察的对象(它是异步的),所以您需要返回一个可观察的对象或一个Promise。

返回可观察值:

isActive(id: string): Observable<boolean> {
    return this.getUsers()
        .pipe(
            map(
                activeUsers =>
                    !!(activeUsers.find(p => p.id == id))
            )
        );
    }

用法:

isActive(id).subscribe(result => console.log(result))

如果我想要一个承诺,我将从此代码开始并添加更多内容:

isActive(id: string): Promise<boolean> {

    const isActiveObservable = this.getUsers()
        .pipe(
            map(
                activeUsers =>
                    !!(activeUsers.find(p => p.id == id))
            )
        );
    };
    return new Promise<boolean>(
        (resolve, reject) {
            let subscription = isActiveObservable 
                .subscribe({
                    next: isActive => {
                        subscription.unsubscribe();
                        resolve(isActive);
                    },
                    error: e => reject(e) 
                }
            );
        } 
    );
}

用法:

isActive(id).then(userIsActive => console.log(userIsActive));

或使用async关键字:

let userIsActive:boolean = await isActive(id);
console.log(userIsActive)