【问题标题】:Why i still getting an undefined return here? [closed]为什么我仍然在这里得到未定义的回报? [关闭]
【发布时间】:2022-01-30 23:53:29
【问题描述】:

我正在尝试从我的 Firestore DB 异步函数 cvUpload 中获取值。但是无论我等待该值多长时间,如果我在我的组件上调用它,它仍然是未定义的。

我看到很多人在 async await 和 promises 方面有同样的问题。但我真的无法解决它。我真的需要一些提示。

DatabaseService.ts

export class DatabaseService {

constructor(
   private dbService : DatabaseService ) {}


async cvUpload (id : string) {
   const userRef = collection(this.db, this.user_db)
   const q = query(userRef, where("id", "==", id));
   const querySnapshot = await getDocs(q);

   querySnapshot.forEach((doc) => {
     console.log(doc.data().cv) /// False (Thats correct)
     return   doc.data().cv;
});
}

DashboardComponent.ts

  constructor(
    private dbService : DatabaseService ) {
   }

   async ngOnInit() {
    await this.checkCV('uyDer0BxoVekGU2XnYa3Xm77nm03')
   }


    async checkCV(id : any)  {
     let result = await this.dbService.cvUpload(id) /// This shoud return FALSE
     }

感谢您提供任何帮助或提示,让我在这里更进一步

【问题讨论】:

    标签: javascript angular firebase google-cloud-firestore async-await


    【解决方案1】:

    实际的错误在于 cvUpload 方法。您实际上没有从 cvUpload 函数返回任何内容。在 Array.forEach() 中返回一些东西不算作 cvUpload 的返回值。

    也许你应该返回

    async cvUpload(id: string) {
            const userRef = collection(this.db, this.user_db)
            const q = query(userRef, where("id", "==", id));
            const querySnapshot = await getDocs(q);
        
            return querySnapshot.docs[0].data().cv;
        };
    

    【讨论】:

    • 请注意,在这段代码中,我们只是返回第一个文档的简历数据。
    【解决方案2】:

    首先,这里:

    querySnapshot.forEach((doc) => {
         console.log(doc.data().cv) /// False (Thats correct)
         return   doc.data().cv;
    ...
    

    您正在执行 forEach...我猜您正在等待仅接收 1 个项目...但如果不是,请小心,因为您只会处理第一个元素...

    不管怎样,假设你只有一个元素:

    您可能对“虚假”返回值有问题...您可以尝试用一个对象来处理所有这些问题,以检查它是否仍然发生?

    类似这样的:

    数据库服务.ts

    querySnapshot.forEach((doc) => {
         console.log(doc.data().cv) /// False (Thats correct)
         const result: {result: boolean};
         result = { result: doc?.data()?.cv ?? false, };
         return result;
    });
    

    仪表板组件.ts

    async checkCV(id : any)  {
         const {result} = await this.dbService.cvUpload(id) /// This shoud return FALSE
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-16
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多