如何使用异步/等待正确编写

时间:2018-07-11 16:59:19

标签: javascript node.js async-await

这里的新手Web开发人员,我正在做一个项目,并且遭受了一些回调的麻烦,所以我读了一点,发现了关于异步/等待的内容,我试图在代码中使用它(在我的种子文件中)数据库尝试我的网站,但它似乎无法正常工作。 基本上,我有类别,子类别和产品,我想先创建所有类别,然后再创建子类别,然后创建产品,但我似乎无法使其按顺序工作。

这是我的代码:

async function addCats() {
  //CREATE CATEGORIES
  //async.each(categories, function(category, callback){
  for (const category of categories) {
    await Category.create({
      name: category
    }, function(err, createdCategory) {
      if (err)
        console.log(err);
      else {
        console.log("Created category ");
      }
    });
  }
}

async function addSubs() {
  sub_categories.forEach(function(sub) {
    //Find the Parents ID
    Category.find({
      name: sub.parent
    }, function(err, foundParent) {
      if (err)
        console.log(err);
      else {
        SubCategory.create({
          name: sub.name,
          parent: {
            name: sub.parent,
            id: foundParent._id
          }
        }, function(err, createdSub) {
          if (err)
            console.log(err);
          else
            console.log("Created sub-category");
        })
      }
    })
  })
}

function seedDB() {
  Category.remove({}, function(err) {
    if (err)
      console.log(err);
    else {
      SubCategory.remove({}, function(err) {
        if (err)
          console.log(err);
        else {
          Product.remove({}, function(err) {
            if (err)
              console.log(err);
            else {
              addCats();
              addSubs();

              //CREATE PRODUCTS
              products.forEach(function(product) {
                //Find category ID
                Category.find({
                  name: product.category
                }, function(err, foundCategory) {
                  if (err)
                    console.log(err);
                  else {
                    //Find sub-category ID
                    SubCategory.find({
                      name: product.sub_category
                    }, function(err, foundSubCategory) {
                      if (err)
                        console.log(err);
                      else {
                        //See if the ID's are linked?
                        console.log('fsub: ' + foundSubCategory + ' fsubP: ' + foundSubCategory)
                        if (!foundSubCategory.parent._id.equals(foundCategory._id))
                          console.log("This is not a valid categories sub-category");
                        else {
                          //CREATE PRODUCT
                          Product.create({
                            name: product.name,
                            category: product.category,
                            subcategory: product.sub_category,
                            price: product.price,
                            description: product.description
                          }, function(err, createdProduct) {
                            if (err)
                              console.log(err);
                            else
                              console.log("Created product: " + createdProduct);
                          })
                        }
                      }
                    })
                  }
                })
              })
            }
          });
        }
      });
    }
  });
}

即使我注释掉添加产品的最后一部分,我仍然无法先创建要创建的类别,然后再创建子类别,它们仍然会无序创建。

谢谢

1 个答案:

答案 0 :(得分:1)

所以,一个东西突然出现在我身上。

异步/等待在Promises上工作,因此您需要确保使用的是ORM / ODM库的Promise语法。假设您使用的是Mongoose(或类似的东西),则将回调传递给.create()调用(例如),推入使用回调样式,而不返回一个Promise异步/等待可以挂钩。

作为示例,您的第一个函数应如下所示:

async function addCats() {
  for (const category of categories) {
    try {
       await Category.create({
         name: category
       });
       console.log('created category');
    } catch (e) {
       console.log(e.message);
    }
  }
}

还请注意,您没有返回任何东西;不知道这是否是故意的。