Как убедиться, что все операции в облачной функции были успешно завершены? - PullRequest
0 голосов
/ 09 сентября 2018

Я использую облачные функции Firebase, которые запускаются при создании документа в Firestore. При создании объекта Мне нужно параллельно выполнить две разные операции:

  1. обновить значение поля в конкретном документе (а не в том, который был создан и вызвал функцию облака)
  2. выполнить транзакцию для другого документа.

Итак, мои вопросы:

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

Вот мой текущий код:

exports.onCityCreated = functions.firestore
    .document('Cities/{cityId}')
    .onCreate((snap, context) => {
        const db = admin.firestore(); 
        const newCity = snap.data();
        const mayorId = newEvent.mayorID;
        const mayorRef = db.doc('Users/'+ mayorId);

        const timestamp = admin.firestore.FieldValue.serverTimestamp();
        db.doc('Utils/lastPost').update({timestamp: timestamp});    //First Operation - Timestamp Update

        return db.runTransaction(t => {    //Second Operation - Transaction
                return t.get(mayorRef).then(snapshot => {
                    var new_budget = snapshot.data().b - 100;
                    return t.update(mayorRef, {b: new_budget});
                })
            .then(result => {
                return console.log('Transaction success!');
            })
            .catch(err => {
                console.log('Transaction failure:', err);
            });
        });
});

1 Ответ

0 голосов
/ 09 сентября 2018

Всякий раз, когда у вас есть несколько подобных операций, решение состоит в том, чтобы использовать Promise.all(). Это принимает массив обещаний и, в свою очередь, возвращает обещание, которое разрешается, когда все обещания, которые вы передали, разрешены.

exports.onCityCreated = functions.firestore
    .document('Cities/{cityId}')
    .onCreate((snap, context) => {
        const db = admin.firestore(); 
        const newCity = snap.data();
        const mayorId = newEvent.mayorID;
        const mayorRef = db.doc('Users/'+ mayorId);

        const timestamp = admin.firestore.FieldValue.serverTimestamp();
        var p1 = db.doc('Utils/lastPost').update({timestamp: timestamp});

        var p1 = db.runTransaction(t => {
                return t.get(mayorRef).then(snapshot => {
                    var new_budget = snapshot.data().b - 100;
                    return t.update(mayorRef, {b: new_budget});
                })
        });
        return Promise.all([p1, p2]);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...