2010-08-18 174 views
0

我已经为产品详细信息(productId,name,quantityonhand)创建了一个Web存储并从服务器向其中填充记录。我必须验证所需数量是否可用于接受订单。HTML5顺序执行

对于网络存储中可用的每种产品以及相应的文本输入字段,Product窗体都有复选框(带有name =“product”)来接受所需的数量。

验证方法定义如下。

function productValidation(){ 

    for(i=0;i<document.Products.product.length;i++){ 

     // checking whether the product has been checked/choosen 

     if (document.Products.product[i].checked==true){ 
     var productId = document.Products.product[i].value; 
      var qty = document.Products.p[i].value; 
      var db = systemDB; 

      // validating the available quantity 

      db.transaction(
       function(transaction){ 
        transaction.executeSql('select * from product where productId=?;', 
        [productId], 
        function(transaction, results){ 
         for (var j=0; j<results.rows.length; j++) { 
          var row = results.rows.item(j); 
          if (qty>row['qoh']){ 
           alert(
            row['productname'] 
            + ' is out of stock. We can serve you only ' 
            + row['qoh'] + ' quantities currently!');          
           document.Products.product[i].checked = false;      
           document.Products.p[i].value = 0; 
          } 
         } 
        }); 
       } 
      ); 
     } 
    } 
    return false; 
} 

当执行,因为db.transaction的异步特性的验证码,是越来越执行外环和验证只发生在过去的产品choosen。

帮我解决这个问题。我希望执行顺序发生。

Yuvi

回答

0

尝试链接在一起,在db.transaction回调函数调用:

function productValidation(){ 

    checkProductsSequential(document.Products.product, 0); 
    return false; 
} 

function checkProductsSequential(products, i) 
{ 
    if (i < products.length) 
    { 
     // checking whether the product has been checked/choosen 
     if (document.Products.product[i].checked==true){ 
      var productId = document.Products.product[i].value; 
      var qty = document.Products.p[i].value; 
      var db = systemDB; 

      // validating the available quantity 

      db.transaction(
       function(transaction){ 
        transaction.executeSql('select * from product where productId=?;', 
        [productId], 
        function(transaction, results){ 
         for (var j=0; j<results.rows.length; j++) { 
          var row = results.rows.item(j); 
          if (qty>row['qoh']){ 
           alert(
            row['productname'] 
            + ' is out of stock. We can serve you only ' 
            + row['qoh'] + ' quantities currently!');          
           document.Products.product[i].checked = false;      
           document.Products.p[i].value = 0; 
          } 
         } 
         checkProductsSequential(products, i + 1) 
        }); 
       } 
      ); 
     } 
     else 
     { 
      checkProductsSequential(products, i + 1) 
     } 
    } 
}