在因为DB-呼叫的承诺使用异步。我怎样才能解决这个反模式?

问题描述 投票:0回答:1

我有一个火力地堡功能从数据库中发回的数据。问题是,有时我不得不返回数据的所有的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块的?

javascript function firebase ecmascript-6 promise
1个回答
1
投票

您可以使getList功能async代替,而不new Promisetry / 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())
);
© www.soinside.com 2019 - 2024. All rights reserved.