Доступ к методу метода изнутри функции стрелки - PullRequest
3 голосов
/ 19 января 2020

В моем приложении vuetify / vue. js я пытаюсь прочитать коллекцию пожарного магазина, которую я храню, чтобы рассчитать средний рейтинг по всем хранящимся там рейтингам:

function updateRating() {
  let firestoreQuery = firebase
      .firestore()
      .collection('ratings')
      .where('qrCodeId', '==', this.qrCode.id);

  let ratingsSum = 0;
  let ratingsAmountCounter = 0;

  firestoreQuery.get().then(querySnapshot => {
    querySnapshot.forEach(doc => {
      ratingsSum += doc.rating;
      ratingsAmountCounter++;
    });
  });
}

Однако Я не могу получить доступ к переменным ratingsSum и ratingsAmountCounter из моей функции стрелки forEach. Я уже пытался использовать this или var _this = this обходной путь, но оба, кажется, не работают, и все еще сообщает:

'ratingsSum' is assigned a value but never used (no-unused-vars)

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 января 2020

Как показывают комментарии, проблема в том, что у вас нет кода, который на самом деле читает ratingsSum и ratingsAmountCounter. Сообщение об ошибке говорит вам, что ESLint сработал по правилу " no-unused-vars ", чтобы сообщить вам об этом. Переменные, которые никогда не читаются, вероятно, являются ошибкой или, по крайней мере, ненужным кодом.

Что вам, вероятно, следует сделать, это вернуть обещание вызывающей стороне, чтобы они могли получить значения в любое время, когда асинхронный get() завершено и значения рассчитаны. Например:

function updateRating() {
  let firestoreQuery = firebase
      .firestore()
      .collection('ratings')
      .where('qrCodeId', '==', this.qrCode.id);

  let ratingsSum = 0;
  let ratingsAmountCounter = 0;

  return firestoreQuery.get().then(querySnapshot => {
    querySnapshot.forEach(doc => {
      ratingsSum += doc.rating;
      ratingsAmountCounter++;
    });
    return { ratingsSum, ratingsAmountCounter }
  });
}

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

updateRating().then(result => {
  const { ratingsSum, ratingsAmountCounter } = result;
  // Now you can use ratingsSum and ratingsAmountCounter...
})
0 голосов
/ 19 января 2020

это может сработать, у меня нет возможности проверить это, так как я не знаю, как использовать vue, но здесь идет

   async function getData(){
      return await firebase
          .firestore()
          .collection('ratings')
          .where('qrCodeId', '==', this.qrCode.id)
          .get()
        }
    })

, тогда вы можете сделать это:

getData().then(_querySnapshot => {
        var ratingsSum = 0
        var ratingsAmountCounter = 0
      _querySnapshot.forEach(doc => {
        ratingsSum += doc.rating;
        ratingsAmountCounter++;
      });
});
...