1

我希望我的回调函数等到ClientProductLinks被填满后再通过 res.send() 发送它。我确定有一个简单的解决方案,但我是 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作为空数组发回。任何帮助是极大的赞赏。

4

1 回答 1

2

snapshot1.forEach在真正编写异步代码时,您期望同步执行 ( )。

在这种情况下,您应该能够使用Promise.all来等待您的所有产品链接。

类似(未经测试):

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);
});
于 2019-09-27T19:18:55.373 回答