2016-05-26 31 views
-1

我在一个下拉列表中有各种产品。如果我更换产品,价格变化和生产线成本变化与订购数量相符。为什么我的Ajax调用不检索请求的值?

问题:当我选择产品时,会对我的DB进行Ajax调用。返回正确的price。都好。当我从下拉菜单中选择替代产品时,产品ID及其变化正确。但是,并非返回新的正确价格,price将显示上一个查询的值。也就是说,似乎price正在被缓存,或者阵列data[0].price未被清除,或者Ajax调用失败。我不相信Ajax调用失败,好像我做了进一步的产品更改,我得到一个新结果,但是,再次price值来自其前面的查询。底线,我的price始终是一个查询背后。我曾尝试使用cache:false,但这已经有所作为。我也尝试设置变量result的长度为0,刚刚发送undefined错误。

$(".product_id").on('change', function() {      //THIS GETS THE VALUE OF A PRODUCT FROM THE DB 

    var value = parseFloat($(this).val()); // product_id 
    var row = $(this).parents(':eq(1)').find('input').filter(".cost"); 
    var rowPrice = $(this).parents(':eq(1)').find('input').filter(".price"); 

    // then we use the product_id to grab the price using AJAX // 
    $.ajax({ 
     type: 'GET', 
     url: 'product_prices/' + value, 
     cache:false, 
     success: function(data) { 
       data = JSON.parse(data); 
       var result = data[0].price; 
       var price = Number(result); //.toFixed(2); 
       row.data('price', price); // store the row's current price in memory 
       rowPrice.val(price); // allocate the price to the location called rowPrice 
     } 
    }); 

    var quantity = $(this).parents(':eq(1)').find('input').filter(".quantity").val(); 

    if (quantity > 0){ 
     var price = row.data('price'); 
     var cost = (price * quantity); 
     cost = Number(cost); //.toFixed(2); 
     var displaycost = $.formatNumber(cost,{format:"#,###.00",locale:"ca"}); 
     row.val(displaycost); 

     var subTotal = 0; 
     $("input.cost").each(function(){ 
      var ic = $(this).val(); 
      if (ic !==''){ 
       var inputCost = parseFloat(ic.replace(/,/g, '')); 
       subTotal += inputCost;} 
     }); 

     var discount_percent = $("#discount").val(); 
     if(discount_percent ==""){ 
      discount_percent = 0; 
     } 
     var calculations = newCalculate(subTotal, discount_percent); 
     setValues(calculations, $("#updateValues")); 

    } 
}); 

回答

1

Ajax调用是异步的,这意味着您为其提供的回调函数仅在稍后执行。在你的情况,这意味着此声明:

row.data('price', price); 

比这以后执行(异步):

var price = row.data('price'); 

...这的确意味着您将price先前获取的值。

为避免这种情况,您可能希望将大部分代码移动到提供给$.ajax()success回调函数中,以便在您实际收到价格数据时才执行该函数。

+0

这是否适合您?你能让我知道吗? – trincot

相关问题