在用作另一个函数中的回调函数之前,函数不会完全初始化

Posted

技术标签:

【中文标题】在用作另一个函数中的回调函数之前,函数不会完全初始化【英文标题】:Function won't completely initialize until used as a callback function in another function 【发布时间】:2020-01-07 08:45:01 【问题描述】:

我正在使用 jQuery 和本地存储做一个购物车,我遇到了一个正在发生的问题。

我创建了一个函数renderCart(),我想在每次页面重新加载时显示它,但是如果我在我的 document.ready 函数中初始化它,它不会执行代码,但是如果我创建一个按钮 #show -cart,然后我将renderCart() 函数传递给它,然后单击它后,我将看到呈现的购物车。

你知道为什么我的代码在重新加载页面时不会初始化吗?我怎样才能让它工作?

'use strict'

const products = [
    "id": 0,
    "name": "Bamboo Tootbrush",
    "price": 9.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet..",
    "url": "css/img/item1.jpg",
    "sale": true,
    "category": "bathroom"
  ,
  
    "id": 1,
    "name": "Bamboo Dental Floss",
    "price": 10.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item2.jpg",
    "sale": false,
    "category": "bathroom"
  ,
  
    "id": 2,
    "name": "Bamboo Swabs",
    "price": 8.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item3.jpg",
    "sale": true,
    "category": "bathroom"
  ,
  
    "id": 3,
    "name": "Eco-friendly Straws",
    "price": 12.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item4.jpg",
    "sale": true,
    "category": "kitchen"
  ,
  
    "id": 4,
    "name": "Set of 3 produce bags",
    "price": 11.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item5.jpg",
    "sale": false,
    "category": "kitchen"
  ,
  
    "id": 5,
    "name": "MESH produce bags",
    "price": 11.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item6.jpg",
    "sale": false,
    "category": "kitchen"
  ,
  
    "id": 6,
    "name": "Straws",
    "price": 11.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item7.jpg",
    "sale": false,
    "category": "kitchen"
  ,
  
    "id": 7,
    "name": "Tootbrush ECOholic",
    "price": 11.99,
    "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
    "url": "css/img/item8.jpg",
    "sale": false,
    "category": "bathroom"
  
]

$(document).ready(function() 

  //Nacitanie navigacie a footeru na vsetkych strankach
  $('.menu').load('http://127.0.0.1:5500/ITvKurze-Projekt/menu.html');
  $('footer').load('http://127.0.0.1:5500/ITvKurze-Projekt/footer.html');

  showFavProduct();
  showProduct();
  filter();
  addToCart();

  renderCart(); //this wont render

  //this below will
  $('#show-cart').click(function showCart() 
    renderCart();
  );

  addCartInfoToCartList();
  cartCount();

  for (let i = 0; i < products.length; i++) 
    console.log(products[i]);
  


  $('.clear-btn').click(function clearCartbutton() 
    clearCart();
  );

  function addToCart() 
    $('.add-btn').on("click", function(e) 

      let productID = e.target.attributes.productid.value
      let actualCart = localStorage.getItem('productsID');

      if (actualCart == null) 
        actualCart = [];
       else 
        actualCart = JSON.parse(actualCart);
      

      actualCart.push(productID);
      localStorage.setItem('productsID', JSON.stringify(actualCart));

      console.log(`Just added product to cart with ID: $ productID `);
      cartCount();
      console.log(JSON.stringify(actualCart));
      renderCart();
    );
  ;

  function addCartInfoToCartList() 
    for (let i = 0; i < products.length; i++) 
      products[i].qty = undefined;
    

    let actualCart = localStorage.getItem('productsID');

    if (actualCart === null) 
      actualCart = [];
     else 
      actualCart = JSON.parse(actualCart);
    

    for (let i = 0; i < actualCart.length; i++) 
      let productPosition = actualCart[i];

      if (products[productPosition].qty === undefined) 
        products[productPosition].qty = 1;
       else 
        products[productPosition].qty++;
      
    
  

  function cartCount() 
    let cartLength;
    if (!localStorage.getItem('productsID')) 
      cartLength = [];
      console.log('Your cart is empty');
      $('.cart').text(`(0)`);
      // !!!!! neviem preco mi nefunguje pri prvom inicializovani riadok vyssie !!!!
     else 
      cartLength = localStorage.getItem('productsID');
      let cartCount = JSON.parse(cartLength).length;
      console.log(`Number of products in cart: $ cartCount .`);
      $('.cart').text(`($ cartCount )`);
    
  ;

  function clearCart() 
    localStorage.clear();

    for (let i = 0; i < products.length; i++) 
      products[i].qty = undefined;
    
    $('.cart-container').empty();
    console.log('Your cart is empty');
  ;
  //ZOBRAZENIE PRODUKTOV V CART ELEMENTE
  function renderCart() 
    for (let i of products) 
      if (i.qty !== undefined) 
        let productDiv = `<div class="fav-wrap $i.category">`;
        productDiv += `<img class="fav" src="$i.url">`;
        productDiv += `<div class="name">$ i.name </div>`;
        productDiv += `<div>Price: $ i.price  EUR</div>`
        productDiv += `<div class="add-btn" productid="$ i.id ">ADD TO CART</div>`;
        productDiv += '</div>';

        $('.cart-container').append(productDiv);
      ;
    ;
  ;

  //Zobrazenie akciovych produktov na index.html v sekcii Our Favourites
  function showFavProduct() 
    for (let i of products) 
      if (i.sale === true) 
        let productDiv = `<div class="fav-wrap $i.category">`;
        productDiv += `<img class="fav" src="$i.url">`;
        productDiv += `<div class="name">$ i.name </div>`;
        productDiv += `<div>Price: $ i.price  EUR</div>`
        productDiv += `<div class="add-btn" productid="$ i.id ">ADD TO CART</div>`;
        productDiv += '</div>';

        $('#fav-products').append(productDiv);
      
    
  

  //Zobrazenie vsetkych produktov na SHOP.html
  function showProduct() 

    for (let i of products) 

      let productDiv = `<div class="fav-wrap $i.category">`;
      productDiv += `<img class="fav" src="$i.url">`;
      productDiv += `<div class="name">$ i.name </div>`;
      productDiv += `<div>Price: $ i.price  EUR</div>`
      productDiv += `<div class="add-btn" productid="$ i.id ">ADD TO CART</div>`;
      productDiv += '</div>';

      $('#all-products').append(productDiv);
    
  

  //Vyber kategorie v SHOPE
  function filter() 
    $('#all').click(function() 
      $(".kitchen, .bathroom").show();
      $(this).addClass("selected");
      $("#cat-kitchen, #cat-bath").removeClass("selected");
    );

    $('#cat-kitchen').click(function() 
      $(".bathroom").hide();
      $(".kitchen").show();
      $("#all, #cat-bath").removeClass("selected");
      $(this).addClass("selected");
    );

    $('#cat-bath').click(function() 
      $(".kitchen").hide();
      $(".bathroom").show();
      $("#all, #cat-kitchen").removeClass("selected");
      $(this).addClass("selected")
    );
  
);

我希望在重新加载页面后立即看到存储在本地存储中的实际购物车,因此我不必每次都单击显示购物车按钮。

【问题讨论】:

页面加载时是否存在$('.cart-container'),或者您在不同的地方将其添加到ajax? products 变量从何而来?它是从 ajax 调用返回的吗? 是的,.cart-container 存在于我的 html.file 中,我现在已经在我的 script.js 文件的顶部写入了我的变量 products。 @jcubic 你能把你的整个代码放进去吗(在问题里面)? 如果你 console.log(products) 怎么办?你确定它的价值吗?控制台有错误吗? 刚刚编辑了整个代码@jcubic 【参考方案1】:

您的代码运行并且您的函数执行。

但它只包含一个带有if (i.qty !== undefined) 的循环。

事实上,你的所有对象在开始时都不包含qty,所以循环不会做任何事情。它做了它应该做的事情。

// No "qty" anywhere.
 
      "id": 1,
      "name": "Bamboo Dental Floss",
      "price": 10.99,
      "description": "This is a description of the item that you are about to buy. It is eco-friendly and buy buying this product you are helping the environment and the planet.",
      "url": "css/img/item2.jpg",
      "sale": false,
      "category": "bathroom"
 

【讨论】:

谢谢,它帮助我更好地理解它并且我找到了解决方案。【参考方案2】:

我现在明白了。

我的 addCartInfoToCartList(); 从 LocalStorage 更新我的产品在我的 renderCart() 之后被初始化(它也更新了数量)。我已经改变了顺序。

现在可以了。

【讨论】:

以上是关于在用作另一个函数中的回调函数之前,函数不会完全初始化的主要内容,如果未能解决你的问题,请参考以下文章

如何返回地理位置响应对象以用作另一个函数的参数

JavaScript闭包和回调详解

通过 Boost Python 将 Python 函数转换为 C++,用作回调

useState - 回调函数的参数

如何将回调作为参数传递给另一个函数

js的回调函数的理解