Как я могу сделать этот код работает с асинхронным - PullRequest
0 голосов
/ 29 апреля 2018
router.post("/cart/paycash/add-order",(req,res) => {
    req.checkBody("emri","Ju lutem vendosni emrin").notEmpty();
    req.checkBody("mbiemri","Ju lutem vendosni mbiemrin").notEmpty();
    req.checkBody("numritelefonit","Ju lutem vendosni numrin e telefonit").notEmpty();
    req.checkBody("qyteti","Ju lutem vendosni qytetin").notEmpty();
    var emri = req.body.emri;
    var mbiemri = req.body.mbiemri;
    var telefoni = req.body.numritelefonit;
    var email = req.body.email;
    var qyteti = req.body.qyteti;
    var adresa = req.body.adresa;

    var Cart = req.session.cart;

    var errors = req.validationErrors();
    if(errors) {
        res.redirect("/cart/checkout", {
            errors:errors
        });
    }
    else {
        Orders.find({}, function(err,orders) {
            if(err) {
                console.log(err);
            }
            else {
                var order=new Orders({
                    emri:emri,
                    mbiemri:mbiemri,
                    telefoni:telefoni,
                    email:email,
                    qyteti:qyteti,
                    adresa:adresa,   
                });
                console.log(Cart.length);
                Cart.forEach(function(product) {
                    var cart = Cart.length;
                    var productTitle = product.title;
                    console.log(productTitle);
                    for (var i = 0; i < 1; i++) {
                       Products.findOne({title:product.title}, function(err,foundproduct) {
                           console.log(foundproduct.title)
                           order.products.push(foundproduct);   
                           order.save();;
                        });
                    }
                });
            }
        });

       delete req.session.cart;
        delete req.session.promocode;
        res.redirect("/dyqani");
    }
});

Я хочу, чтобы этот код работал, но для этого мне нужен async. Я попробовал некоторые методы, но я не мог заставить это работать. Может кто-нибудь мне помочь? Я хочу иметь возможность добавлять в свою базу данных заказов все продукты, которые есть в корзине, но поскольку mongoose работает асинхронно, а JavaScript - нет, некоторые запросы загружаются раньше, а результаты в моей базе данных не совпадают с моя корзина.

1 Ответ

0 голосов
/ 30 апреля 2018

Похоже, что вы пытаетесь асинхронно запрашивать каждый продукт, который есть в вашей корзине. Вам не нужен вложенный цикл for в вашей функции forEach, потому что этот цикл, похоже, ничего не делает.

Сначала необходимо отобразить все асинхронные запросы в массиве и запустить Promise.all, чтобы запросить их все асинхронно

let products = Cart.map((product) => {
    return Products.findOne({title:product.title},(err,foundproduct) => {
      //your save product to order logic
   });
})

Promise.all(products).then((complete) => {
    console.log('product added')
})

Вот подробное объяснение того, как обещания работают в javascript Обещания Javascript

Шаблон разработки вашего приложения также необычен, но это выходит за рамки этого вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...