我的Firebase应用程序具有以下功能。
但是每次我部署它时,都会收到此消息:
142:12警告避免嵌套promises promise / no-nesting
✖1个问题(0个错误,1个警告)
exports.cronTravas = functions.database.ref('acoes').onUpdate((change, context) => {
const acoes = change.after.val();
var acoesNovas = [];
var travas = {}
for (var key in acoes) {
var item = {
'key': key,
'ult': acoes[key].ult
}
acoesNovas[key.substring(0, 4)] = item;
}
return admin.database().ref().child('opcoesNew').orderByChild('strike').once('value')
.then((snap) => {
const opcoes = snap.val();
travas['travasAlta'] = {}
for (var data in opcoes) {
travas['travasAlta'][data] = {}
for (var ativo in opcoes[data]) {
travas['travasAlta'][data][ativo] = {}
var i = 0;
for (var opcao in opcoes[data][ativo]) {
i++;
travas['travasAlta'][data][ativo] = calculaTravas(opcoes[data][ativo], acoesNovas[ativo].ult);
}
}
}
return travas;
})
.then(travas => {
return admin.database().ref().update(travas).catch((error) => {
return console.error(error);
});
})
});
也就是说,如何删除此警告?
而且,如果有关系,此功能会在几分钟内消耗大量配额来生成此消息:
错误:超出配额(函数调用中的CPU分配:每个 天,函数调用中的CPU分配:每天);增加 配额,请在xxxxxxx的项目中启用结算功能。功能不能是 被执行。
是否有一种优化它的方法,以便我可以使用此免费配额而不会浪费它? (我知道我可以升级,但我现在真的在尝试免费计划)。
我的数据库如下:
acoes (8)
opcoes
-datas(4)
--acao(8)
---opcao(160)
因此,在我的“ opcoes”节点内,我有4个“数据”节点,每个节点都有8个“ acao”节点,每个节点都有“ 160”个opcao节点。因此,我至少有5k个节点,并且每次“ acoes”节点更新时(每分钟1x),我都必须遍历所有这些节点。关于如何改善它的任何想法?
答案 0 :(得分:0)
应该通过对代码进行以下修改来解决第一个警告:
exports.cronTravas = functions.database.ref('acoes').onUpdate((change, context) => {
const acoes = change.after.val();
var acoesNovas = [];
var travas = {}
for (var key in acoes) {
var item = {
'key': key,
'ult': acoes[key].ult
}
acoesNovas[key.substring(0, 4)] = item;
}
return admin.database().ref().child('opcoesNew').orderByChild('strike').once('value')
.then((snap) => {
const opcoes = snap.val();
travas['travasAlta'] = {}
for (var data in opcoes) {
travas['travasAlta'][data] = {}
for (var ativo in opcoes[data]) {
travas['travasAlta'][data][ativo] = {}
var i = 0;
for (var opcao in opcoes[data][ativo]) {
i++;
travas['travasAlta'][data][ativo] = calculaTravas(opcoes[data][ativo], acoesNovas[ativo].ult);
}
}
}
// return travas; <- Don't return travas here, as it is not a promise.
// but return the promise returned by the update() method
return admin.database().ref().update(travas);
})
});
对于“超出配额”警报,此SO可能会给您一些指示:Function killed. Error: quota exceeded。请注意,使用您的初始代码,Cloud Function无法正确终止。