HTML5 последовательное выполнение - PullRequest
0 голосов
/ 18 августа 2010

Я создал веб-хранилище для сведений о продукте (productId, name, amountonhand) и заполнил записи в нем с сервера.Я должен проверить, есть ли необходимое количество, чтобы принять заказ.

Форма продукта имеет флажки (с именем = "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 выполняется внешний цикл и выполняется проверкатолько для последнего выбранного продукта.

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

Юви

1 Ответ

0 голосов
/ 18 августа 2010

Попробуйте объединить вызовы в функцию обратного вызова для 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)
        }
    }
}
...