首页 > 解决方案 > FCF 正在工作,但我收到此警告:避免嵌套承诺 promise/no-nesting

问题描述

我编写了一个 http FCF,它运行两个链接的事务。它有效,但我不知道为什么会收到此警告:

119:16  warning  Avoid nesting promises  promise/no-nesting

这是我写的函数:

exports.checkeaEstadoFinanciero = functions.https.onRequest((req, res) => {
  const body = JSON.parse(req.body);
  const RestoID = body.id;
  const db = admin.firestore();
  const restoRef = db.collection('Restaurantes').doc(RestoID);
  const facturasRef = db.collection('Facturas').where('restaurantID', '==', RestoID);
  return db.runTransaction(transaction => {
    return transaction.get(restoRef).then((restoDoc) => {
      if (restoDoc) {
        if ((restoDoc.data().cicloFacturacion.termino - Date.now()) < 0) {
          //emite una factura
          restoRef.set({ httpPropTest: 'worked fine' }, { merge: true });
        }
      }
      return null;
    })
    .then(() => {
      return db.runTransaction(tran => {
        return tran.get(facturasRef).then(facturasDoc => {
          const holder = [];
          facturasDoc.forEach(doc => {
            holder.push(doc.data());
          })
          console.log('facturas documents', holder);
          return null;
        })
      })
    })
    .catch(err => console.log('error: ', err));
  })
})

我从其他用户那里读到了这个帖子:

Google Cloud Functions - 警告避免嵌套承诺承诺/不嵌套

我正在做最被接受的答案建议,但我仍然有这个警告。

我该如何解决这个问题?

标签: javascriptgoogle-cloud-functionseslint

解决方案


我的猜测是 ESlint 正在查看您的第二笔交易:

.then(() => {
  return db.runTransaction(tran => {
    return tran.get(facturasRef).then(facturasDoc => {
      const holder = [];
      ...
    })
  })
})

并抱怨对then()另一个then()回调内部的调用。它不明白事务的嵌入 then() 与第一个并不真正相关。

您可以尝试通过将第二个事务移动到单独的函数来隐藏 ESlint 的这一事实,使其不再出现嵌套:

.then(() => {
  return secondTransaction()
})


function secondTransaction() {
  return db.runTransaction(tran => {
    return tran.get(facturasRef).then(facturasDoc => {
      const holder = [];
      ...
    })
  })
}

推荐阅读