【问题标题】:Async function is returning undefined异步函数返回未定义
【发布时间】:2020-05-14 18:23:44
【问题描述】:

我真的需要重温我的异步等待和承诺。我会喜欢一些建议。

我正在对 firebase firestore 进行异步函数调用。该函数应根据单个输入参数返回一个字符串。

该功能适用​​于 1-1 用户聊天。 该功能是创建聊天/查找现有聊天,并返回其 ID。

现在,我得到undefined 作为openChat 的返回值,但不知道为什么。除了返回之外,该函数还可以正常工作。

我有两个功能。一个是 React 类组件生命周期方法,另一个是我的 firebase 异步函数。

这是类组件生命周期方法:

async getChatId(userId) {
  let chatPromise = new Promise((resolve, reject) => {
    resolve(openChat(userId))
  })
  let chatId = await chatPromise
  console.log('chatId', chatId) //UNDEFINED
  return chatId
}

async requestChat(userId) {
  let getAChat = new Promise((resolve, reject) => {
    resolve(this.getChatId(userId))
  })
  let result = await getAChat
  console.log('result', result) //UNDEFINED
}

render() {
  return (<button onClick = {() => this.requestChat(userId)}>get id</button>)
}

这里是异步函数:

// both my console.log calls show correctly in console
// indicating that the return value is correct (?)

export async function openChat(otherPersonId) {
  const user = firebase.auth().currentUser
  const userId = user.uid

  firestore
    .collection('users')
    .doc(userId)
    .get()
    .then(doc => {
      let chatsArr = doc.data().chats

      let existsArr =
        chatsArr &&
        chatsArr.filter(chat => {
          return chat.otherPersonId === otherPersonId
        })
      if (existsArr && existsArr.length >= 1) {
        const theId = existsArr[0].chatId

        //update the date, then return id

        return firestore
          .collection('chats')
          .doc(theId)
          .update({
            date: Date.now(),
          })
          .then(() => {
            console.log('existing chat returned', theId)
            //we're done, we just need the chat id
            return theId
          })
      } else {
        //no chat, create one

        //add new chat to chats collection
        return firestore
          .collection('chats')
          .add({
            userIds: {
              [userId]: true,
              [otherPersonId]: true
            },
            date: Date.now(),
          })
          .then(docRef => {
            //add new chat to my user document

            const chatInfoMine = {
              chatId: docRef.id,
              otherPersonId: otherPersonId,
            }
            //add chat info to my user doc
            firestore
              .collection('users')
              .doc(userId)
              .update({
                chats: firebase.firestore.FieldValue.arrayUnion(chatInfoMine),
              })

            //add new chat to other chat user document
            const chatInfoOther = {
              chatId: docRef.id,
              otherPersonId: userId,
            }
            firestore
              .collection('users')
              .doc(otherPersonId)
              .update({
                chats: firebase.firestore.FieldValue.arrayUnion(chatInfoOther),
              })
            console.log('final return new chat id', docRef.id)
            return docRef.id
          })
      }
    })
}

如果您有任何有用的提示,我将永远感激不尽!

预期结果是返回的字符串。该字符串正确显示在 async 函数的 console.log 中)。

实际结果是异步函数的返回值是未定义的。

【问题讨论】:

标签: javascript reactjs firebase promise async-await


【解决方案1】:

您不会从 openChat 函数返回任何内容,因此该函数解析为 undefined

你必须写:

export async function openChat(otherPersonId) {
  const user = firebase.auth().currentUser
  const userId = user.uid

  return firestore // here you need to return the returned promise of the promise chain
    .collection('users')
    .doc(userId)
    .get()
    /* .... */
}

getChatIdrequestChat 中的那些new Promise 没有多大意义。等待openChat(userId)this.getChatId(userId) 的结果就足够了

async getChatId(userId) {
  let chatId = await openChat(userId)
  console.log('chatId', chatId) //UNDEFINED
  return chatId
}

async requestChat(userId) {
  let result = await this.getChatId(userId)
  console.log('result', result) //UNDEFINED
}

【讨论】:

    【解决方案2】:

    如果你想返回它们的值,你应该await你的firestore调用的结果,你已经在使用async函数:

    export async function openChat(otherPersonId) {
        const user = firebase.auth().currentUser
        const userId = user.uid
    
        const doc = await firestore
            .collection('users')
            .doc(userId)
            .get()
    
        let chatsArr = doc.data().chats
    
        let existsArr =
            chatsArr &&
            chatsArr.filter(chat => chat.otherPersonId === otherPersonId)
        if (existsArr && existsArr.length >= 1) {
            const theId = existsArr[0].chatId
    
            //update the date, then return id
    
            await firestore
                .collection('chats')
                .doc(theId)
                .update({
                    date: Date.now(),
                })
    
            return theId
        } else {
    
            const docRef = await firestore
                .collection('chats')
                .add({
                    userIds: { [userId]: true, [otherPersonId]: true },
                    date: Date.now(),
                })
    
            const chatInfoMine = {
                chatId: docRef.id,
                otherPersonId: otherPersonId,
            }
            //add chat info to my user doc
            firestore
                .collection('users')
                .doc(userId)
                .update({
                    chats: firebase.firestore.FieldValue.arrayUnion(chatInfoMine),
                })
    
            //add new chat to other chat user document
            const chatInfoOther = {
                chatId: docRef.id,
                otherPersonId: userId,
            }
            firestore
                .collection('users')
                .doc(otherPersonId)
                .update({
                    chats: firebase.firestore.FieldValue.arrayUnion(chatInfoOther),
                })
            console.log('final return new chat id', docRef.id)
            return docRef.id   
        }
    }
    

    您还应该直接等待您对该函数的调用:

    async getChatId(userId) {
        let chatId = await openChat(userId)
        console.log('chatId', chatId) //UNDEFINED
        return chatId
    }
    
    async requestChat(userId) {
      let result = await this.getChatId(userId)
      console.log('result', result) //UNDEFINED
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多