Облачные функции Google: предупреждение Избегайте вложенных обещаний обещание / отсутствие вложений + 5 000 регистров - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть следующая функция в моем приложении Firebase.

Но каждый раз, когда я его развертываю, я получаю следующее сообщение:

142: 12 предупреждение Избегайте вложенных обещаний обещание / нет-nesting

problem 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);
    });
  })
});

Тем не менее, как я могу удалить это предупреждение?

И, если оно имеет значениеэта функция потребляет большое количество квоты, генерируя это сообщение за несколько минут:

Ошибка: превышена квота (выделение ЦП при вызовах функций: за день, выделение ЦП при вызовах функций: за день);чтобы увеличить квоты, включите биллинг в вашем проекте на ххххххх.Невозможно выполнить функцию.

Есть ли способ оптимизировать ее, чтобы я мог использовать эту свободную квоту, не увеличивая ее?(Я знаю, что могу обновить, но сейчас я действительно пытаюсь работать над бесплатным планом).

Моя база данных выглядит так:

acoes (8)
opcoes
-datas(4)
--acao(8)
---opcao(160)

Итак, внутри моих «операционных операторов»У меня есть 4 узла 'данных', и у каждого из них есть 8 узлов 'acao', и у каждого из них есть 160 узлов 'opcao'.Таким образом, у меня есть по крайней мере 5 тыс. Узлов, и я должен повторять их все каждый раз, когда обновляются узлы «acoes» (это 1 раз в минуту).Есть идеи как его улучшить?

1 Ответ

0 голосов
/ 28 сентября 2018

Первое предупреждение должно быть решено с помощью следующих модификаций вашего кода:

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 может дать вам несколько указаний: Функция убита,Ошибка: квота превышена .Обратите внимание, что с вашим исходным кодом облачная функция завершается неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...