Как сократить / оптимизировать эту функцию, оставаясь совместимым с ESlint (всегда возвращаемый) - PullRequest
0 голосов
/ 26 марта 2019

У меня проблемы с тем, чтобы эта функция соответствовала правилам ESlint, но не выглядела глупо (возвращаться туда, где возвращение не требуется).Это заставляет меня думать, что я делаю что-то неправильно или что-то не понимаю в обещаниях.

Я попробовал эту функцию следующим образом

Это принято:

    let getDoc = fb.db.collection("characters");
    let char = new character();
    let query = getDoc
      .where("name", "==", name)
      .get()
      .then(snapshot => {
        if (snapshot.empty) {
          console.log("No matching documents.");
          return promise.reject(err);
        } else {
        snapshot.forEach(doc => {
          console.log(doc.id, "=>", doc.data());
          char.id = doc.id;
          char.name = doc.data().name;
          char.type = doc.data().type;
          return char;
        });}
        return char;
      })
      .catch(err => {
        console.log("Error getting documents", err);
        return "Error getting documents", err;
      });
    return query;     
  }

This is not:

read(name) {
    let getDoc = fb.db.collection("characters");
    let char = new character();
    let query = getDoc
      .where("name", "==", name)
      .get()
      .then(snapshot => {
        if (snapshot.empty) {
          console.log("No matching documents.");
          return promise.reject(err);
        }

        snapshot.forEach(doc => {
          console.log(doc.id, "=>", doc.data());
          char.id = doc.id;
          char.name = doc.data().name;
          char.type = doc.data().type;
          return char;
        });
      })
      .catch(err => {
        console.log("Error getting documents", err);
        return "Error getting documents", err;
      });
    ## tried with and without return query here ##
  }

I expected there to not to be a warning from ESlint regarding a missing return, as the function should always return either an error (No such document) or a character (char).

1 Ответ

1 голос
/ 26 марта 2019

Во втором примере вы никогда не возвращаете "char" в блоке .then(). return char; внутри вашего цикла возвращает значение для функции, которую вы передали forEach, а не блок then. На самом деле весь ваш цикл forEach вообще ничего не делает.

.then(snapshot => {
    if (snapshot.empty) {
      console.log("No matching documents.");
      return promise.reject(err); // <-- Return error
    }

    snapshot.forEach(doc => {
      console.log(doc.id, "=>", doc.data());
      char.id = doc.id;
      char.name = doc.data().name;
      char.type = doc.data().type;
      return char; // <--- This return is for the forEach function
    });

    return char; // <----- Added return here
})

Я не думаю, что этот код будет делать то, что вы хотите, хотя. Это вернет последнее значение char из цикла.


Если вы намеревались изменить значения внутри снимка, вы должны использовать map вместо forEach.

.then(snapshot => {
    if (snapshot.empty) {
      console.log("No matching documents.");
      return promise.reject(err); // <-- Return error
    }

    // Convert array of docs to array of Characters 
    snapshot = snapshot.map(doc => {
      console.log(doc.id, "=>", doc.data());
      let c = new Character();
      c.name = doc.data().name;
      c.type = doc.data().type;
      return c;
    });

    return snapshot; // <---- return converted array
})
...