javascript - JS函数返回函数而不是值
问题描述
我一直在尝试通过从 Firebase 数据库中获取数据来使用 JS 制作一个简单的数学函数。我们有两种类型——收入和支出。
最初这里是引用 Firebase 的代码片段
let reference = firebase.database().ref("expenditure");
let reference1=firebase.database().ref("income");
这让我们可以创建两个不同的数据库,分别命名为支出和收入
现在,我创建了两个函数来遍历数据库中的元素并将其添加到变量中
这些函数应该分别返回支出和收入。
var income=0;
var expenditure=0;
function amount(data){
let expens = data.val();
let keys = Object.keys(expens);
console.log(keys.length);
for( let i=0;i<keys.length;i++){
let a =keys[i];
let amount_a = expens[a].Amount;
var p=parseInt(amount_a);
var expenditure=p+expenditure;
}
return expenditure;
}
function amount1(data){
let expens = data.val();
let keys = Object.keys(expens);
console.log(keys.length);
for( let i=0;i<keys.length;i++){
let a =keys[i];
let amount_a = expens[a].Amount;
var p=parseInt(amount_a);
var income=p+income;
}
return income;
}
如您所见,我已经声明了两个函数来返回收入和支出
现在,我在另一个名为result()
function result(){
var a=reference.on("value",amount);
var b=reference1.on("value",amount1);
console.log(b-a);
}
result();
这应该返回我净额(收入-支出)但是,我amount(data),amount1(data)
在 console.log 中获得了相同的功能,而不是返回收入和支出的价值。
我尝试了几种方法,但无法弄清楚。
解决方案
Firebase.on(...)
函数不会从数据库返回值,它会将值发送到作为参数传递的回调函数。
您应该使用回调函数更新变量。假设你的数据库结构是这样的:
(root)
-- expenditure
---- (key)
------- Amount: 0
---- (key)
------- Amount: 0
-- income
---- (key)
------- Amount: 0
---- (key)
------- Amount: 0
那么你的代码应该更像这样:
let expenditureRef = firebase.database().ref("expenditure");
let incomeRef = firebase.database().ref("income");
let expenditures = 0;
let income = 0;
let netAmount = 0;
expenditureRef.on("value", function (snapshot) {
snapshot.forEach(function (childSnapshot) {
expenditures += parseInt(childSnapshot.val().Amount);
netAmount = income - expenditures;
}
});
incomeRef.on("value", function (snapshot) {
snapshot.forEach(function (childSnapshot) {
income += parseInt(childSnapshot.val().Amount);
netAmount = income - expenditures;
}
});
我无法对此进行测试,所以如果这不起作用,请随时告诉我,我可以尝试修复它。
我还强烈建议您阅读此处的文档: https ://firebase.google.com/docs/database/web/read-and-write
推荐阅读
- python - Python中许多图像的快速而强大的图像拼接算法?
- google-cloud-dns - 无法打开 Google Cloud DNS 页面
- symfony - 更改复选框值时更改表单字段选项 - Symfony 5.1
- c# - 从离线回到在线后,我想重新加载应用程序 IOS/Android - Xamarin
- c# - EPPlus 在读取单元格值时删除毫秒
- java - 为retrofit2的每个请求添加标头
- javascript - Webpack:--hot 或 HotModuleReplacementPlugin 不起作用
- r - 用单个统计值表征 R 中的水果收获时间
- laravel - Laravel 请求数组验证
- swift - 滚动 watchos 选择器时引发的定位错误