javascript - 通过使用 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;
});
解决方案
Promise 是回调的替代方案。它们提高了可读性,简化了错误处理,并将任务分解为可组合的单元。Promise 是一项可能尚未完成的任务。当 Promise 的任务成功完成时,Promise 被“完成”,否则被“拒绝”。您可以通过调用其 then 方法与 Promise 进行交互,该方法应在 Promise 被履行或拒绝时执行。
您可以在此处查看有关 Firebase 和 JavaScript 承诺的更多信息:https ://firebase.googleblog.com/2016/01/keeping-our-promises-and-callbacks_76.html
推荐阅读
- react-native - 在 React-Native 中显示视频
- opengl - 使用法线贴图渲染会导致依赖于旋转的光照
- mysql - 如何在按日期时间排序的 mySQL 表中查找最后一个值?
- javascript - 需要帮助编写一个函数以使网格内的任何框都可点击并填充色轮
- json - 在将 json 转换为 Dart 中的对象列表时如何避免这么多的转换和映射?
- java - 约束布局在层次结构中返回错误的 id
- firebase - 是否有 Firebase API 端点来获取帐户使用情况?
- ruby-on-rails - 例如,如何更改“User.group(:age).count”的输出?
- javascript - Javascript - 捕获重复序列?
- mongodb - MongoDB查询子文档$gt