通过使用云函数和实时数据库链接承诺,对数据库进行顺序读/写



我正在做一个项目,需要我将数据上传到Firebase实时数据库,并使用云函数执行一些操作。这些操作需要按顺序进行,一个接一个,所以我正在链接 JavaScript 承诺。

由于我是 JavaScript 的新手,我不太理解承诺的概念,并且在尝试部署代码时遇到错误。我根据我对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;
});

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

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

最新更新