首页 > 解决方案 > 通过使用 Cloud Functions 和实时数据库链接 Promise 对 DB 进行顺序读/写

问题描述

我正在做一个项目,该项目需要我将数据上传到 firebase 实时数据库并使用云功能执行一些操作。这些操作需要一个接一个地按顺序进行,因此我将 JavaScript 承诺链接起来。

由于我是 JavaScript 新手,我不太了解 Promise 的概念,并且在尝试部署代码时遇到错误。我会根据我对 JS 的原始理解提出这段代码。如果有更好的方法来实现这一点,请告诉我。

这是代码片段:

var initialWaterHeight, currentWaterHeight, waterUsedBeforeTankFill, usageTracking;
var promise1, promise2;
exports.setMotor = functions.database.ref('BORE Tank/Depth')
.onUpdate((snapshot, context) => {
    var currentWaterHeight = snapshot.before.val;
    const levelChange = snapshot.before.val - snapshot.after.val;
    const time = new Date(Date.now() + 19800000).toLocaleString();
    if (levelChange >= 0.2)
    {
        promise1 = snapshot.ref.parent.child('Motor').set(1) ;
    }
    else
    {
        promise1 = snapshot.ref.parent.child('Motor').set(0) ;
    }
    promise2 = snapshot.after.ref.parent.child('Time').set(time);
    return Promise.all([promise1, promise2]);
}).then( () => {
    functions.database.ref('BORE Tank/Motor')
    .onUpdate((snapshot, context) => {
        if (snapshot.before.val === 0 && snapshot.after.val === 1)
        {
            admin.database().ref('BORE Tank/waterUsedBeforeTankFill')
            .once('value', function(snap) {
                waterUsedBeforeTankFill = snap.val();
            });
            admin.database().ref('BORE Tank/initialWaterHeight')
            .once('value', function(snap){
                initialWaterHeight = snap.val();
            });
            promise1 = snapshot.ref.parent.child('usageTracking').set(0);
            promise2 = snapshot.ref.parent.child('waterUsedBeforeTankFill')
            .set(waterUsedBeforeTankFill + Math.abs((initialWaterHeight - currentWaterHeight)));
            return Promise.all([promise1, promise2]);
        }
    else if (snapshot.before.val === 1 && snapshot.after.val === 0)
    {
        promise1 = snapshot.ref.parent.child('usageTracking').set(1);
        promise2 = snapshot.ref.parent.child('initialWaterHeight').set(currentWaterHeight);
        return Promise.all([promise1, promise2]);
    }
});
return null;
}).then(() =>{
    admin.database().ref('BORE Tank/usageTracking')
    .once('value', function (snap){
        usageTracking = snap.val();
    });
    if (usageTracking)
    {
        return admin.database.ref('BORE Tank/usage')
        .set(waterUsedBeforeTankFill + Math.abs((initialWaterHeight - currentWaterHeight)));
    }
    return null;
});

标签: javascriptfirebase-realtime-databasegoogle-cloud-functions

解决方案


Promise 是回调的替代方案。它们提高了可读性,简化了错误处理,并将任务分解为可组合的单元。Promise 是一项可能尚未完成的任务。当 Promise 的任务成功完成时,Promise 被“完成”,否则被“拒绝”。您可以通过调用其 then 方法与 Promise 进行交互,该方法应在 Promise 被履行或拒绝时执行。

您可以在此处查看有关 Firebase 和 JavaScript 承诺的更多信息:https ://firebase.googleblog.com/2016/01/keeping-our-promises-and-callbacks_76.html


推荐阅读