首页 > 解决方案 > 异步函数返回未定义的类型

问题描述

我有一个异步函数,它调用数据库并返回一个字符串(承诺)。但是,当我调用此函数时,我得到未定义

异步函数:

const SUCCESS = 'Channel storage initialized succesfully';
const FAIL = 'There has been a problem initializng this channel';
const EXISTS = 'Channel already initialized'

initializeChannelDatabase = async channelNum =>{
    const db = admin.firestore();
    db.collection('channels').doc(channelNum).get().then(res=>{
        if(!res.exists){
            db.collection('channels').doc(channelNum).set({isPremium: false}).then(res=>{
                return Promise.resolve(SUCCESS);
            }).catch(err=>{
                return Promise.resolve(FAIL);
            })
        }else{
            return Promise.resolve(EXISTS);
        }
    }).catch(err=>{
        return Promise.resolve(FAIL);
    })
}

然后我从这里调用此函数,但在控制台中未定义:

client.on('message', async msg => {
    if(msg.content==='\'init'){
        initializeChannelDatabase(msg.channel.id).then(result=>{
            console.log(result);
            if(result===SUCCESS){
            ...

标签: javascriptasynchronousdiscord.js

解决方案


它是未定义的,因为您实际上并没有从initialiseChannelDatabase函数中返回任何内容。

由于您使用的是异步,因此在使用异步函数时也应该使用“等待”,这样处理这种情况会更容易,无需额外的闭包和回调:

initializeChannelDatabase = async channelNum => {

    const db = admin.firestore();

    try {

        let channelDoc = await db.collection('channels').doc(channelNum).get();
    
        if (!channelDoc.exists) {

            await db.collection('channels').doc(channelNum).set({ isPremium: false });
    
            return SUCCESS;

        } else {
            return EXISTS;
        }

    } catch (err) {
        return FAIL;
    }
}

在此链接上有关 async / await 的其他信息

编辑:删除了内部的 try-catch,因为如果失败,它将触发第一个 catch 并且无论如何都很好。


推荐阅读