как запустить res.render () только тогда, когда сначала выполняются инструкции, написанные выше? - PullRequest
0 голосов
/ 02 августа 2020

В приведенном ниже коде я хочу финишировать sh сначала завершение для l oop, а затем после выполнения res.render () (я имею в виду синхронно), но здесь функция res.render () запускается до завершения для l oop ..... Однако, если я использую setTimeout (function () {res.render ("checkout", {user: req.user, cartItems: cartItems, sum: sum})}, 1500 ); это работает, но я делаю это настойчиво, потому что вышеупомянутое для l oop завершается до 1500 миллисекунд, поэтому правильные элементы будут отображаться на передней стороне. Пожалуйста, помогите мне .... Я просто хочу запустить его сразу после того, как все мои задачи будут выполнены. . . . . .

app.get("/profile/checkout", function(req, res) {
    if(req.isAuthenticated()) {
        var cartItems=[];
        var sum=0;
        if(req.user.cart.length >= 1) {
            for(let eachItems of req.user.cart) {
                Product.findOne({_id: eachItems.product_id}, function(err, foundData) {
                    if (err) throw err;
                    else {
                        sum = sum + foundData.price;
                        var obj = {
                            cart_item_id: eachItems._id,
                            product_id: foundData._id,
                            brand: foundData.brand,
                            title: foundData.title,
                            price: foundData.price,
                            image: foundData.image,
                            selected_size: eachItems.selected_size
                        };
                        cartItems.push(obj);
                        console.log(cartItems);
                     }
                });
            }
            res.render("checkout", {
                user: req.user, 
                cartItems: cartItems, 
                sum: sum
            });
        } else {
            res.render("checkout", {user: req.user});
        }
    } else {
        res.redirect("/home/login");
    }
});

1 Ответ

0 голосов
/ 02 августа 2020

Вы можете сделать что-то подобное, используя Promise.all. Это будет ждать, пока l oop не закончится и все обещания не будут выполнены, прежде чем переходить к ответу. (где-то может быть синтаксическая ошибка, которую я не тестировал):

app.get("/profile/checkout",async function(req,res){
  if(req.isAuthenticated()) {
    var sum=0;
    if(req.user.cart.length>=1){
        
      const cartItems = await Promise.all( req.user.cart.map( async ( eachItem ) => {
        const foundData = await Product.findOne({_id:eachItems.product_id})

        sum += foundData.price;

        var obj={
          cart_item_id:eachItems._id,
          product_id:foundData._id,
          brand:foundData.brand,
          title:foundData.title,
          price:foundData.price,
          image:foundData.image,
          selected_size:eachItems.selected_size
        };

        return Promise.resolve( obj )
      } )

      res.render("checkout",{user:req.user, cartItems, sum});

    }else{
      res.render("checkout",{user:req.user});
    }
  else {
    res.redirect("/home/login");
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...