Eslint излишне предупреждает "обещание / отсутствие вложенности" с транзакциями Firestore

У меня данные Firestore структурированы следующим образом:

Eslint излишне предупреждает "обещание / отсутствие вложенности" с транзакциями Firestore

Я хочу запуститьTransaction () для дочернего элемента trend_score. Моя функция работала до добавления второго .then (result =>, что означает, что теперь, когда я добавил еще один метод к облачной функции, я получаю сообщение об ошибке:

    const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.handler = functions.firestore.document('/Polls/{pollId}/responses/{userId}').onCreate((data, context) => {
                  const answerSelected = data.data().answer;

                  const answerRef = admin.firestore().doc(`Polls/${context.params.pollId}/answers/${answerSelected}`);
                  const voteCountRef = admin.firestore().doc(`Polls/${context.params.pollId}`);
                  const trendScoreRef = admin.firestore.doc(`Polls/${context.params.pollId}/trend_score`);

                   return admin.firestore().runTransaction(t => {
                               return t.get(answerRef)
                                   .then(doc => {
                                       if (doc.data()) {
                                           t.update(answerRef, { vote_count: doc.data().vote_count + 1 });
                                       }
                                   })
                           }).then(result => {
                               return admin.firestore().runTransaction(t => {
                                           return t.get(voteCountRef)
                                               .then(doc => {
                                                   if (doc.data()) {
                                                       t.update(voteCountRef, {vote_count:doc.data().vote_count+1});
                                                   }
                                               });
                                        });
                           //starting with this set, I believe this code has caused the issue
                           }).then(result => {
                               return admin.firestore().runTransaction(t => {
                                           return t.get(trendScoreRef)
                                                .then(doc => {
                                                  if (doc.data()) {
                                                      t.update(trendScoreRef, {trend_score:doc.data().trend_score+1});
                                                  }
                                                });
                                        });
           });

Error

     1 problem (1 error, 0 warnings)

    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! functions@ lint: `eslint .`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the functions@ lint script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in:
    npm ERR!     /Users/troychuinard/.npm/_logs/2018-11-10T02_02_56_229Z-debug.log

    Error: functions predeploy error: Command terminated with non-zero exit code1



  [1]: https://i.stack.imgur.com/etVwy.png

В вашем вопросе не отображается весь соответствующий вывод с консоли, но я могу сказать вам прямо сейчас, что eslint жалуется, что у вас есть вложенные обратные вызовы then, что считается плохим стилем и подвержено ошибкам.

Doug Stevenson 10.11.2018 03:12

Понятно, поэтому вместо того, чтобы добавлять дополнительные обратные вызовы, я должен просто добавить еще один t.update в конец первого обратного вызова? Или передовой опыт был бы отдельной функцией? По сути, я хочу обновить 2 места с помощью 1 метода

tccpg288 10.11.2018 03:14

Просто добавьте его как еще один then в цепочку, как показано в дубликате.

Doug Stevenson 10.11.2018 03:16

Разве я не этим занимался по сути?

tccpg288 10.11.2018 03:25

Нет, у вас есть вложенные обратные вызовы thenвнутри, другие then, а не после их.

Doug Stevenson 10.11.2018 03:34

На самом деле это может не быть проблемой для транзакций. Не могли бы вы внимательно изучить сообщение об ошибке eslint, которое вы здесь не показывали, и обновить свой вопрос, включив его /

Doug Stevenson 10.11.2018 03:36

Возможно, мне не хватало кронштейна

tccpg288 10.11.2018 03:44

Да, и если вы добавите это, держу пари, вы получите больше за обещание / отсутствие вложенности.

Doug Stevenson 10.11.2018 03:49

Позвольте нам продолжить обсуждение в чате.

tccpg288 10.11.2018 03:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
551
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После устранения синтаксической ошибки eslint предупреждает вас, что у вас есть вложенные обещания. Обычно это нехорошо, но поскольку они вложены в обратный вызов транзакции, на самом деле здесь нет проблемы. Вы можете отключить это предупреждение в строке, где его находит eslint, добавив этот комментарий в конец строк, о которых он вас предупреждает:

return t.get(answerRef) // eslint-disable-line promise/no-nesting
    .then(...)

Другие вопросы по теме