Javascript 在不使用setTimeout()的情况下,如何使express app回调函数在调用res.send之前等待?
在通过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
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);
});