我有一个火力地堡功能从数据库中发回的数据。问题是,有时我不得不返回数据的所有的3个集,有时只能从1需要,有时他们的2。但是,这是一个反模式。我怎样才能提高我的代码?
现在,我创建一个函数,该函数返回一个承诺,在我使用指日可待越来越分贝值,这被包裹在尝试{}块。
module.exports.getList = (uid, listType) => new Promise(async (resolve, reject) => {
let returnValue = [];
try {
if (listType.contains("a")) {
const block = await db.collection('alist').doc(uid).get();
returnValue.push(block);
}
if (listType.contains("b")) {
const like = await db.collection('blist').doc(uid).get();
returnValue.push(like);
}
if (listType.contains("c")) {
const match = await db.collection('clist').doc(uid).get();
returnValue.push(match);
}
} catch (e) {
return reject(e);
}
return resolve(returnValue);});
我应该如何修改这个片段,以不是一个反模式?或者是不是因为try-catch块的?
您可以使getList
功能async
代替,而不new Promise
或try
/ catch
:
module.exports.getList = async (uid, listType) => {
const returnValue = [];
if (listType.contains("a")) {
const block = await db.collection('alist').doc(uid).get();
returnValue.push(block);
}
if (listType.contains("b")) {
const like = await db.collection('blist').doc(uid).get();
returnValue.push(like);
}
if (listType.contains("c")) {
const match = await db.collection('clist').doc(uid).get();
returnValue.push(match);
}
return returnValue;
};
调用该函数将返回一个错误拒绝一个Promise
如果有一个异步的错误,否则将解析到期望的数组。
需要注意的是,除非有很好的理由await
串行每个呼叫,您可以使用Promise.all
代替,使请求并行出去,并且使代码在这个过程中有很多更简洁:
module.exports.getList = (uid, listType) => Promise.all(
['alist', 'blist', 'clist']
.filter(name => listType.contains(name[0]))
.map(name => db.collection(name).doc(uid).get())
);