Javascript 在不使用setTimeout()的情况下,如何使express app回调函数在调用res.send之前等待?

Javascript 在不使用setTimeout()的情况下,如何使express app回调函数在调用res.send之前等待?,javascript,express,google-cloud-firestore,Javascript,Express,Google Cloud Firestore,在通过res.send()发送回调函数之前,我希望回调函数等待ClientProductLinks被填充。我相信有一个简单的解决方案,但我对JS是新手,似乎无法理解 app.all('/:client/listproducts', async function(req, res) { const client = req.params.client; let clientProductLinks = []; const clientRef = await db.collecti

在通过res.send()发送回调函数之前,我希望回调函数等待
ClientProductLinks
被填充。我相信有一个简单的解决方案,但我对JS是新手,似乎无法理解

app.all('/:client/listproducts', async function(req, res) {
   const client = req.params.client;
   let clientProductLinks = [];
   const clientRef = await db.collection(client).get();
   const snapshot1 = await clientRef;
   snapshot1.forEach(async function (prod) {
       let prodRef = await db.collection(client).doc(prod.id).collection(prod.id).get();
       let snapshot2 = await prodRef;
       snapshot2.forEach(function (doc) {
           const obj = {
               docID: doc.id,
               docData: doc.data()
           };
           clientProductLinks.push(obj);
       });
   });
   res.send(clientProductLinks);
});

当前,res.send()将
ClientProductLinks
作为空数组发送回。非常感谢您的帮助。

在编写异步代码时,您希望同步执行(
snapshot1.forEach

在这种情况下,您应该能够使用等待所有产品链接

类似于(未经测试):


在foreach循环中使用wait的方式并没有按预期的方式工作。您需要将承诺收集到一个数组中,并一起实际等待它们。这可能会有帮助:
Array.forEach
不会等待它的回调。您需要使用
for..of
循环或
承诺。所有
。非常感谢可能的副本。运行此操作将产生未处理的PromisejectionWarning:TypeError:snapshot1.map不是函数。我以前有过这个问题;出于某种原因,我可以在快照数组上调用forEach(),但不能调用map()。什么是
db
?Mongo DB?实际上是firestore
app.all('/:client/listproducts', async function(req, res) {
  const client = req.params.client;
  const snapshot1 = await db.collection(client).get();
  const getProduct = async prod => {
    return new Promise(async (resolve, reject) => {
      try {
        const snapshot2 = await db
          .collection(client)
          .doc(prod.id)
          .collection(prod.id)
          .get();
        const links = [];
        snapshot2.forEach(function(doc) {
          const obj = {
            docID: doc.id,
            docData: doc.data()
          };
          links.push(obj);
        });
        resolve(links);
      } catch (error) {
        reject(error);
      }
    });
  };

  const clientProductLinks = await Promise.all(snapshot1.map(getProduct));
  res.send(clientProductLinks);
});