Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用async await一个接一个地链接函数_Javascript_Node.js - Fatal编程技术网

Javascript 使用async await一个接一个地链接函数

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

我的函数应该截断firestore集合,在填充它之后,问题是在删除所有文档之前,某些文档被写入。我是一个使用async Wait的noob,我的代码中有错误:

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 !");