【问题标题】:Firestore return true when data is retrieved (Wait fore data to get send)检索数据时 Firestore 返回 true(等待数据发送)
【发布时间】:2021-01-09 16:48:20
【问题描述】:

我对这段代码有一点问题:

  function usernameExists(username) {
    const result = db.collection('users').where("username", "==", username).get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
          console.log("true");
          return true;
        });
        console.log("false");
        return false;
    })
    .catch(error => {
        return error.message;
    });
  }

所以问题是它永远不会到达它可以返回 true 或 false 的点,它只是返回 undefined,但是当用户名存在时它发送 console.log true,当它尚未被使用时发送 false。 我怎样才能等到收到数据?

【问题讨论】:

  • 请说明您是如何使用usernameExists 函数的,或者尽可能分享部分代码。
  • atm 这样:console.log(usernameExists("Test"));我只是想看看一个用户名是否已经被占用了
  • 您需要使用 async await 制作函数才能获得此类类型的响应。参考:medium.com/javascript-in-plain-english/…

标签: javascript firebase google-cloud-firestore


【解决方案1】:

这是因为您没有返回promises chain。您应该按照以下方式进行操作:

  function usernameExists(username) {
    return db.collection('users').where("username", "==", username).get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
          console.log("true");
          // Do something
        });
        // return something;
    })
    .catch(error => {
        return error.message;
    });
  }

例如:

  function usernameExists(username) {
    return db.collection('users').where("username", "==", username).get()
    .then(function(querySnapshot) {
        const theReturnedArray = [];
        querySnapshot.forEach(function(doc) {
          console.log("true");
          theReturnedArray.push(doc.get("theField"));
        });
        return theReturnedArray;
    })
    .catch(error => {
        return error.message;
    });
  }

或者,既然你在 cmets 中说“我只是想看看用户名是否已经被占用”:

  function usernameExists(username) {
    return db.collection('users').where("username", "==", username).get()
    .then(function(querySnapshot) {
        if (querySnapshot.empty) {
           return false;
        } else {
           return true;
        } 
    })
    .catch(error => {
        return error.message;
    });
  }

注意usernameExists()本身是一个异步函数,所以需要使用then()或者async/await:

 usernameExists(username)
     .then(result => {
           console.log(result);
     }); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 2021-05-25
    • 2021-03-29
    • 2019-02-20
    • 1970-01-01
    • 2021-12-31
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多