Javascript 使用async await一个接一个地链接函数
我的函数应该截断firestore集合,在填充它之后,问题是在删除所有文档之前,某些文档被写入。我是一个使用async Wait的noob,我的代码中有错误:Javascript 使用async await一个接一个地链接函数,javascript,node.js,Javascript,Node.js,我的函数应该截断firestore集合,在填充它之后,问题是在删除所有文档之前,某些文档被写入。我是一个使用async Wait的noob,我的代码中有错误: let db = admin.firestore(); let truncateCollection = async function () { const snapshot = await db.collection(collectionToPopulate).get(); await snapshot.docs.ma
let db = admin.firestore();
let truncateCollection = async function () {
const snapshot = await db.collection(collectionToPopulate).get();
await snapshot.docs.map(function (doc) {
db.collection(collectionToPopulate).doc(doc.id).delete().then(function () {
console.log("document supprimé : "+doc.id);
}).catch(function (error) {
console.error("erreur de suppression de document",error);
});
});
await populate();
};
let populate = async function () {
jsonInput.forEach(function (obj, index) {
Object.entries(obj).forEach(([key,value]) => {
//console.log(value);
db.collection(collectionToPopulate).doc(key).set({
name: value.name,
imageUrl: value.image_url,
}).then(function (docRef) {
console.log("Document written with ID: ", key);
}).catch(function (error) {
console.error("Error adding document: ", error);
});
});
});
};
truncateCollection();
res.send("Job Done !");
docs.map()。相反,return
由delete().then().catch()
返回的承诺,并对docs.map()的返回值应用promise.all
:
两个问题
- 您没有为
.map
使用Promise.all
,因此它实际上没有做任何事情。同时,您也没有从中回报承诺
- populate方法使用的是forEach,它不适用于承诺。将其更改为使用
for..of
像这样的
const db = admin.firestore();
// eslint-disable-next-line func-style
const truncateCollection = async function () {
const snapshot = await db.collection(collectionToPopulate).get();
await Promise.all(snapshot.docs.map(function (doc) {
return db.collection(collectionToPopulate).doc(doc.id).delete().then(function () {
console.log(`document supprimé : ${doc.id}`);
}).catch(function (error) {
console.error("erreur de suppression de document", error);
});
}));
await populate();
};
// eslint-disable-next-line func-style
const populate = async function () {
for (const obj of jsonInput) {
for (const [key, value] of Object.entries(obj)) {
try {
// eslint-disable-next-line no-await-in-loop
const response = await db.collection(collectionToPopulate).doc(key).set({
"name": value.name,
"imageUrl": value.image_url
});
console.log("Document written with ID: ", key);
} catch(err) {
console.error("Error adding document: ", error);
}
}
}
};
truncateCollection();
res.send("Job Done !");
非常感谢你!
const db = admin.firestore();
// eslint-disable-next-line func-style
const truncateCollection = async function () {
const snapshot = await db.collection(collectionToPopulate).get();
await Promise.all(snapshot.docs.map(function (doc) {
return db.collection(collectionToPopulate).doc(doc.id).delete().then(function () {
console.log(`document supprimé : ${doc.id}`);
}).catch(function (error) {
console.error("erreur de suppression de document", error);
});
}));
await populate();
};
// eslint-disable-next-line func-style
const populate = async function () {
for (const obj of jsonInput) {
for (const [key, value] of Object.entries(obj)) {
try {
// eslint-disable-next-line no-await-in-loop
const response = await db.collection(collectionToPopulate).doc(key).set({
"name": value.name,
"imageUrl": value.image_url
});
console.log("Document written with ID: ", key);
} catch(err) {
console.error("Error adding document: ", error);
}
}
}
};
truncateCollection();
res.send("Job Done !");