【问题标题】:Google Cloud Functions: warning Avoid nesting promises promise/no-nesting +5k registersGoogle Cloud Functions:警告避免嵌套承诺承诺/不嵌套 +5k 寄存器
【发布时间】:2019-03-04 09:55:27
【问题描述】:

我的 firebase 应用具有以下功能。

但每次我部署它时,我都会收到以下消息:

142:12 警告避免嵌套承诺 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”节点(每分钟 1 次)时,我都必须遍历所有节点。关于如何改进它的任何想法?

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案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;  <- 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。请注意,使用您的初始代码,云函数未正确终止。

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 2020-04-22
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多