Get async value from firestore

前端 未结 3 1162
无人及你
无人及你 2021-01-06 15:35

I am struggling with async operations. I am trying to simply get a value from firestore and storing it in a var.

I manage to receive the value, I can even save it in

相关标签:
3条回答
  • 2021-01-06 16:23

    Finally managed to get it working. Thanks for the input Tomalak!

    getValues(help.collectionName, help.docName)
      .then((text) => {
        console.log(text);
        help.message = text;
       })
      .catch((err) => { console.log("Error: ", err); });
    
    function getValues(collectionName, docName) {
      return db.collection(collectionName).doc(docName).get().then((doc) => {
        if (doc.exists) {
          return doc.data().text;
        }
        else {
          return Promise.reject("No such document");
        }});
      }
    
    bot.help((ctx) => ctx.reply(help.message));
    

    Unfortunately, I can not pin-point the exact reason this worked. Some little fixes (missed comma in the console.log) and formatting definitely helped me understanding the structure though. Hope someone else finds this useful, when starting to play around with node and firebase.

    0 讨论(0)
  • 2021-01-06 16:32

    Since getValues function returns a promise, you need to await getValues function while calling it.

    Change getValues like so -

    function getValues(collectionName, docName,) {
      console.log("start")
      var result;
      return db.collection(collectionName).doc(docName).get()
        .then(function (doc) {
          if (doc.exists) {
            console.log("Document data:", doc.data());
            result = doc.data().text;
            console.log(result);
            return result;
          } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
            result = "No such document!";
            return result;
          }
        }).catch (function (err) {
          console.log('Error getting documents', err);
        });
      };

    Then use getValues like so -

    helpMessage = await getValues('configuration','helpMessage');
    

    Explanation -

    async, await are just syntactic sugar for Promises. async functions return a promise (or AsyncFunction more accurately) which needs to be resolved to use its enclosed value.

    See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

    0 讨论(0)
  • 2021-01-06 16:40

    You have things the wrong way around. It's much easier than you think it is.

    function getValues(collectionName, docName) {
        return db.collection(collectionName).doc(docName).get().then(function (doc) {
            if (doc.exists) return doc.data().text;
            return Promise.reject("No such document");
        }};
    }
    

    If a function returns a promise (like db.collection(...).doc(...).get()), return that promise. This is the "outer" return above.

    In the promise handler (inside the .then() callback), return a value to indicate success, or a rejected promise to indicate an error. This is the "inner" return above. Instead of returning a rejected promise, you can also throw an error if you want to.

    Now you have a promise-returning function. You can use it with .then() and .catch():

    getValues('configuration','helpMessage')
        .then(function (text) { console.log(text); })
        .catch(function (err) { console.log("ERROR:" err); });
    

    or await it inside an async function in a try/catch block, if you like that better:

    async function doSomething() {
        try {
            let text = await getValues('configuration','helpMessage');
            console.log(text);
        } catch {
            console.log("ERROR:" err);
        }
    }
    

    If you want to use async/await with your getValues() function, you can:

    async function getValues(collectionName, docName) {
        let doc = await db.collection(collectionName).doc(docName).get();
        if (doc.exists) return doc.data().text;
        throw new Error("No such document");
    }
    
    0 讨论(0)
提交回复
热议问题