gpt4 book ai didi

javascript - 使用云函数和实时数据库通过链接 Promise 顺序读/写数据库

转载 作者:行者123 更新时间:2023-11-28 03:18:23 24 4
gpt4 key购买 nike

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

由于我是 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;
});

最佳答案

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

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

关于javascript - 使用云函数和实时数据库通过链接 Promise 顺序读/写数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com