首页 > 解决方案 > 如果数据可用,则返回承诺?Firebase-Angular

问题描述

我需要知道这个数据条目是否可用。所以我需要处理返回布尔值的承诺。我尝试了各种方法,但没有奏效。我使用下面的代码来完成任务,我需要将 Promise 作为布尔值返回。

 //constants for the database data lists
    readonly USER_CHILD_ROOT: string = "user";

    list: AngularFireList<any>;

    private newUser: DatabaseUser = {
        uid: "",
        email: "",
        name: "",
        address01: "",
        address02: "",
        address03: "",
        telephone: "",
    }
    fileList: any[];
    constructor(@Inject(AngularFireDatabase) private firebase: AngularFireDatabase) { }

    isUserAvailable(userEmail: string): boolean {
        var output: boolean = false;
        this.firebase.list(this.USER_CHILD_ROOT)
            .snapshotChanges()
            .subscribe(
                list => {
                    this.fileList = list.map(item => { return item.payload.key; });
                    this.fileList.forEach(element => {
                        if (element === userEmail)
                            output = true;
                        //console.log(element);
                    });
                });
        return output;
    }

标签: angularfirebasefirebase-realtime-databasepromisebucket

解决方案


它需要是 Promise 还是只是一个异步进程的结果,该进程被分配给如下所示的某个变量。

// Add a new variable
userAvailable: Boolean = false;

// Fetch the status of that user and update the component property
isUserAvailable(userEmail: string): void {
    this.firebase.list(this.USER_CHILD_ROOT)
        .snapshotChanges()
        .subscribe(list => {
             this.userAvailable = list
               .map(item => item.payload.key)
               .some(element => element === userEmail)
         });
}

您只需要在某处调用上述方法即可根据过程结果设置值。

如果您真的希望它成为一个承诺,那么您可以通过使用.toPromise()而不是订阅 Observable来更改它

async isUserAvailable(userEmail: string): Promise<boolean> {
    return this.firebase.list(this.USER_CHILD_ROOT)
        .snapshotChanges()
        .pipe(
           map(list => {
             return list
               .map(item => item.payload.key)
               .some(element => element === userEmail)
           });
         ).toPromise()
}

推荐阅读