Обновление документа Angular Firestore вызывает бесконечный цикл в подписке - PullRequest
0 голосов
/ 06 января 2019

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

Для этого я подписался на запрос и в течение этого времени я обновляю этот документ. Но, конечно, когда вы обновляете тот же объект, подписка запускается снова, создавая бесконечный цикл. Я попытался включить оператор take(1) pipe rxjs, но это ничего не изменило. Есть предложения?

Вот мой код:

this.afs.collection('users').doc(user.userUID).valueChanges().pipe(take(1)).subscribe((user: userModel) => {
    const currentTokens: string[] = user.notifTokens ? user.notifTokens : [];

    //token variable is provided outside this query
    currentTokens.push(token);

    //this next lines causes the subscription to trigger again
    userRef.doc(user.userUID).update({notifTokens: currentTokens})
  })

1 Ответ

0 голосов
/ 07 января 2019

Я бы рекомендовал вам не использовать подписку в этой ситуации, именно по этой причине. Я понимаю, что Angularfire2 документы не перечисляют этот метод, но базовый пакет Firebase включает метод .get () ... и в то время как документы AF2 не упоминают .get() метод ... исходный код показывает, что он поддерживается.

Попробуйте что-то вроде:

this.afs.collection('users').doc(user.userUID).get().then( (user: userModel) => {
    if (user.exists) {
        console.log("Document data:", user.data());

        // Do stuff with the info you get back here

        const currentTokens: string[] = user.data().notifTokens ? user.data().notifTokens : [];
        currentTokens.push(token);
        userRef.doc(user.data().userUID).update({notifTokens: currentTokens})

    } else {
        // user.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});
...