Как правильно считывать данные из базы, используя Angularfire и asyn c и Observables? - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь зачитать данные из Firebase, где простым запросом я извлекаю организацию по указанному имени.

Проблема, с которой я сталкиваюсь, заключается в том, что запрос работает нормально, а данные извлекаются но в потоке выполнения лог c, где считываются фактические данные, запускается слишком поздно.

Я думаю, это относится к тому, как я работаю с Observables, но я действительно застрял.

Вот мой код:

async getOneOrganizationByName(name: string) {
        console.log("2. Doing the check");
        const query = this.afs.collection<Organization>('organizations', ref => ref.where('name', '==', name).limit(1));

        return query.snapshotChanges().pipe(
            debounceTime(500),
            take(1),
            map(
                changes => { 
                    return changes.map(a => {
                        const data = a.payload.doc.data() as Organization;
                        data.id = a.payload.doc.id;
                        console.log("3. From the check logic: " + data.name);   
                        return data;
                    });
                }
            )
        );
    }

    async nameExists(name: string) {
        if(_.isNil(name)) {
            return false;
        }
        console.log("1. Before the check");

        let foundName: string;

        (await this.getOneOrganizationByName(name)).subscribe((organizations: Organization[]) => {
            foundName = organizations[0].subdomain;
            console.log("4. Set item: " + organizations[0].subdomain);
        });

        console.log("5. Found item: " + foundName);

        if(_.isNil(foundName)) {
            console.log("6. return false")
            return false;
        }
        console.log("6. return true")
        return true
    }

Из приведенного выше кода я ожидал бы см. в выводе консоли: 1, 2, 3, 4, 5, 6 с соответствующими сообщениями, но я получаю 1, 2, 5, 6, 3, 4 .

Как можно Я заверяю блокировку выполнения логи c до считывания данных?

1 Ответ

0 голосов
/ 20 января 2020

Этот код:

        console.log("5. Found item: " + foundName);

        if(_.isNil(foundName)) {
            console.log("6. return false")
            return false;
        }
 console.log("6. return true")

Должен быть внутри обратного вызова subscribe. Поскольку Observables используются в асинхронном коде, поэтому при извлечении данных код после subscribe будет называться first , а когда данные извлекаются полностью, код внутри subscribe будет быть названным.

...