Как вернуть автозаполнение ответного обратного вызова, когда все запросы websql завершены - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь добавить автономную возможность в мое веб-приложение. Он имеет функцию автозаполнения и получает его из URL AJAX. Ответ Ajax генерируется после нескольких запросов sql. Это работает очень хорошо.

Теперь я хочу сделать это в автономном режиме. Для этого я отключил базу данных с помощью Websql (хотя она устарела) и смог синхронизироваться с сервером.

Чтобы отключить его, мне нужно сгенерировать источник автозаполнения из websql. Вот мой пример сценария

$("#add_item").autocomplete({
source: function (request, response) {
    if (!$('#poscustomer').val()) {
        $('#add_item').val('').removeClass('ui-autocomplete-loading');
        bootbox.alert('<?=lang('
        select_above
        ');?>'
    )
        ;
        $('#add_item').focus();
        return false;
    }
    var analyzed = analyze_term(request.term);
    var term = analyzed.term,
        option_id = analyzed.option_id,
        warehouse_id = $("#poswarehouse").val(),
        customer_id = $("#poscustomer").val(),
        limit = 5;
    var getProducts = new Promise(function (resolve, reject) {
        var query = "SELECT products.*, FWP.quantity as quantity, categories.id as category_id, categories.name as category_name FROM `products` LEFT JOIN ( SELECT product_id, warehouse_id, quantity as quantity from warehouses_products ) FWP ON `FWP`.`product_id`=`products`.`id` LEFT JOIN `categories` ON `categories`.`id`=`products`.`category_id` WHERE (`products`.`track_quantity` =0 OR `FWP`.`quantity` >0) AND `FWP`.`warehouse_id` = '" + warehouse_id + "' AND (`products`.`name` LIKE '%" + term + "%' OR `products`.`code` LIKE '%" + term + "%' OR products.name || ' (' || products.code || ')' LIKE '%" + term + "%') GROUP BY `products`.`id` LIMIT " + limit;
        var db = WebSQL('Sync');
        db.query(query, []
        ).fail(function (tx, err) {
            throw new Error(err.message);
        }).done(function (products) {
            var ne = products.map(function (value, index) {
                var data = {};
                value.quantity = 0;
                value.item_tax_method = value.tax_method;
                value.qty = 1;
                value.discount = 0;
                value.serial = '';
                var options = new Promise(function (resolve, reject) {
                    db.query("SELECT product_variants.id as id, product_variants.name as name, product_variants.price as price, product_variants.quantity as total_quantity, FWPV.quantity as quantity FROM `product_variants` LEFT JOIN ( SELECT option_id, warehouse_id, quantity from warehouses_products_variants WHERE product_id = " + value.id + ") FWPV ON `FWPV`.`option_id`=`product_variants`.`id` WHERE `product_variants`.`product_id` = '1' AND `FWPV`.`warehouse_id` = '" + warehouse_id + "' AND `FWPV`.`quantity` > 0 GROUP BY `product_variants`.`id`", []
                    ).fail(function (tx, err) {
                        throw new Error(err.message);
                    }).done(function (array) {
                        resolve(array)
                    });
                });
                var opt;
                options.then(function (options) {
                    if (options.length > 0) {

                        if (option_id && i === 0) {
                            optionById(option_id).then(function (options) {
                                opt = options;
                            })
                        } else {
                            opt = options[0];
                        }
                        if (!option_id || i > 0) {
                            option_id = opt.id;
                        }
                    } else {
                        opt = {
                            price: 0
                        };
                        option_id = false;
                    }
                    value.option = option_id;
                    data.options = opt;
                });
                data.id = makeid(20);
                data.item_id = value.id;
                data.label = value.name + " (" + value.code + ") ";
                data.category = value.category_id;
                data.row = value;
                return data;
            });
            console.log(ne);
            resolve(ne);
        });
    });
    Promise.all([getProducts]).then(function (values) {
        console.log(values);
        response(values[0]);
    });
},
minLength: 1,
autoFocus: false,
delay: 250,
response: function (event, ui) {
    console.log(ui);
    if ($(this).val().length >= 16 && ui.content[0].id == 0) {
        bootbox.alert('No match found', function () {
            $('#add_item').focus();
        }
    )
        ;
        $(this).val('');
    }
    else if (ui.content.length == 1 && ui.content[0].id != 0) {
        ui.item = ui.content[0];
        $(this).data('ui-autocomplete')._trigger('select', 'autocompleteselect', ui);
        $(this).autocomplete('close');
    }
    else if (ui.content.length == 1 && ui.content[0].id == 0) {
        bootbox.alert('no_match_found', function () {
            $('#add_item').focus();
        }
    )
        ;
        $(this).val('');

    }
},
    select: function (event, ui) {
        event.preventDefault();
        if (ui.item.id !== 0) {
            var row = add_invoice_item(ui.item);
            if (row)
                $(this).val('');
        } else {
            bootbox.alert('no_match_found ');
        }
    }
});

Пример кода выше частично работает. Здесь я использовал другое обещание внутри функции карты. в этом обещании к объекту данных добавлено одно свойство с именем 'options', и эта функция карты возвращает массив объекта данных. Когда я регистрирую эти данные в консоли, я получаю свойство 'option'. В функции response () я не получаю это свойство свойства option

Как я могу решить это. Я пробовал много способов, насколько я знаю, но всегда один и тот же результат. затем я нашел пакет npm Web sql обещал , но не смог использовать его, так как мне нужно запустить его на стороне клиента. Я ценю помощь.

...