javascript - 如何确保云函数中的所有操作都顺利完成?

标签 javascript firebase asynchronous google-cloud-firestore google-cloud-functions

我正在使用 Firebase Cloud Functions,它是通过在 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);
            });
        });
});

最佳答案

每当您有多个这样的操作时,解决方案就是使用 Promise.all()。这需要一组 promise ,然后返回一个 promise ,当您传入的所有 promise 都得到解决时,该 promise 就会得到解决。

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]);
});

关于javascript - 如何确保云函数中的所有操作都顺利完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52243610/

相关文章:

java - Java 中的异步事件调度

ios - 如何在 Swift 中使函数成为原子函数?

javascript - AngularJs RouteProvider http 状态 403

javascript - 如何在node.js中查找页面上的所有链接?

firebase - 请求缺少所需的身份验证凭据

javascript - 如何使用 Firebase 数据制作简单的 d3 图表?

javascript - 使用 async/await 仍然返回未定义

javascript - JS数学导致总和为负

javascript - “Read More” 描述默认不隐藏,只有点击按钮后才隐藏

node.js - Firestore 无法与 AWS Lambda 配合使用