2010-08-18 172 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) 
     } 
    } 
}