Избегайте двух запросов одновременно в пожарном магазине - PullRequest
0 голосов
/ 07 января 2019

Я создал функцию для связи с базой данных пожарного магазина. Сначала проверьте, есть ли что-то в отношении. Если нет, то добавьте что-нибудь. Если что-то уже существует, используйте данные и затем удалите запись в запрашиваемом отношении. Но вы должны добавить это в функцию (еще раздел). И теперь возникает вопрос, что происходит, когда два пользователя одновременно выполняют функцию. Есть ли способ поставить второго пользователя в очередь, когда первый пользователь завершил запрос?

let ref = db.collection('relation1').doc('test').collection('user');
      var checkForAdd = ref.get().then(snapshot => {
        if(snapshot.size < 1){
            db.collection('relation1').doc('test').collection('user').add({
                user: 'Test',
                createdAt: Date.now()
            }).catch(err =>{
                console.log(err)
            })
        }

1 Ответ

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

Cloud Firestore поддерживает атомарные операции для чтения и записи данных. В наборе атомарных операций либо все операции выполняются успешно, либо ни одна из них не применяется.

https://firebase.google.com/docs/firestore/manage-data/transactions

// Create a reference to the user doc you want to create if it doesn't exist.
const userCollectionRef = db.collection('relation1').doc('test').collection('user');
const userDocRef = userCollectionRef.doc('documentID');

return db.runTransaction(transaction => {
    // This code may get re-run multiple times if there are conflicts.
    return transaction.get(userDocRef).then(userDoc => {
        if (userDoc.exists) {
            // If something already exists then use the data and
            // then delete the entry in the queried relation.
        } else {
            transaction.update(userDocRef, {
                user: 'Test',
                createdAt: Date.now()
            });
        }
    });
}).then(() => {
    console.log("Transaction successfully committed!");
}).catch(error => {
    console.log("Transaction failed: ", error);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...