2010-08-18 6 views
0

Я создал веб-хранилище для информации о продукте (productId, name, quantityonhand) и запишу в него записи с сервера. Я должен проверить, доступно ли количество, необходимое для принятия заказа.HTML5 Последовательное выполнение

Форма продукта имеет флажки (с именем = «продукт») для каждого продукта, доступного в веб-хранилище, и соответствующее поле ввода текста, чтобы принять требуемое количество.

Метод проверки определяется следующим образом.

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, внешний контур становится выполнена и проверка происходит только за последний выбран продукт.

Помогите мне исправить это. Я хочу, чтобы выполнение выполнялось последовательно.

Yuvi

ответ

0

Try цепочки вместе вызовов в функции обратного вызова для 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) 
     } 
    } 
} 
Смежные вопросы