Проблема в том, что вы никогда не вернетесь из initializeChannelDatabase
. Единственные операторы возврата внутри него помещаются в обратные вызовы then
и catch
. Таким образом, они возвращаются из функции обратного вызова, а не из initializeChannelDatabase
.
Добавление оператора return
перед цепочками обещаний then
/ catch
должно решить проблему и вернуть окончательное обещание, созданное обещанием. цепочка.
initializeChannelDatabase = async channelNum => {
const db = admin.firestore();
return db.collection('channels').doc(channelNum).get().then(res=>{
// ^ return the promise chain
if(!res.exists){
return db.collection('channels').doc(channelNum).set({isPremium: false}).then(res=>{
// ^ return the nested promise chain
return Promise.resolve(SUCCESS);
}).catch(err=>{
return Promise.resolve(FAIL);
})
}else{
return Promise.resolve(EXISTS);
}
}).catch(err=>{
return Promise.resolve(FAIL);
})
}
Однако, поскольку ваша функция уже использует ключевое слово async
, вы также можете использовать функциональность await
вместо построения цепочки обещаний.
initializeChannelDatabase = async channelNum => {
const db = admin.firestore();
try {
const channel = await db.collection('channels').doc(channelNum).get();
if (channel.exists) return EXISTS;
await db.collection('channels').doc(channelNum).set({isPremium: false});
return SUCCESS;
} catch (error) {
return FAIL;
}
}
Я бы также настоятельно рекомендую использовать thow FAIL/EXISTS
вместо return FAIL/EXISTS
. Это гарантирует, что возвращенное обещание будет отклонено. Посадка вызывающего абонента по альтернативному пути catch
. Если целью было объединить успех и неудачу, вы можете оставить все как есть.