javascript - 异步函数返回未定义的类型
问题描述
我有一个异步函数,它调用数据库并返回一个字符串(承诺)。但是,当我调用此函数时,我得到未定义
异步函数:
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){
...
解决方案
它是未定义的,因为您实际上并没有从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 并且无论如何都很好。
推荐阅读
- javascript - 不能在模块外使用 import 语句
- python - Python:不使用数字时如何将值分配为实际参数?
- node.js - 摩卡没有显示测试用例的数量
- python - 在使用请求的某个页面之后无法解析链接
- r - 如何将条形图 + 点图的 y 轴设置为介于 2 个非零负数之间?
- c# - C# - 在批量复制 csv 文件期间将当前日期/时间添加到 SQL Server 表
- javascript - Javascript 中的去抖动不适用于车轮事件
- python - 从最后一列向动态树添加大小
- flutter - 如何在颤动中获得像facebook一样的微光效果?
- c# - 如何使用谷歌翻译 api 转换文本文件?