Вернуть обещание, если данные доступны или нет? Firebase- Angular - PullRequest
0 голосов
/ 02 апреля 2020

Мне нужно знать, доступна ли эта запись данных или нет. Так что мне нужно обработать обещание вернуть логическое значение. Я пробовал разные способы, но это не сработало. Я использую приведенный ниже код для выполнения задачи, мне нужно вернуть обещание как логическое значение.

 //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;
    }

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Должен ли он быть Promise или это может быть просто результат асинхронного c процесса, который присваивается некоторой переменной, как показано ниже.

// 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()
}
0 голосов
/ 02 апреля 2020

Это модифицированное решение сработало.

async isUserAvailable(userEmail: string) {

            return await new Promise(resolve => {
                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) {
                                    resolve(true);
                                } else {
                                    resolve(false);
                                }
                            });
                        });
            });
        }

Позвоните и дождитесь ответа.

let promise = this.fdd.isUserAvailable("user email");
   promise.then(
    function(result){
    if(result)console.log("found!")
    }
   );
...