0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 4
1

Как корректно заменить async: false на async: true

26.04.2017, 11:42. Показов 2793. Ответов 7

Author24 — интернет-сервис помощи студентам
Проблема в том, что данный код устарел, блокирует браузер на время выполнения скрипта и выдает warning:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience.

я понимаю, что нужно использовать колбэки, но у меня не получается корректно внести изменения, все по цепочки начинает отваливаться(

Что за tooltip? config.tooltip в любом случае (async: false или async: true) равен true, но при async: true сразу ошибка:

Uncaught TypeError: Cannot read property 'tooltip' of null

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var JCART = (function() {
 
        // This script sends Ajax requests to config-loader.php and relay.php using the path below
        // We assume these files are in the 'jcart' directory, one level above this script
        // Edit as needed if using a different directory structure
        var path = 'jcart',
            container = $('#jcart'),
            token = $('[name=jcartToken]').val(),
            tip = $('#jcart-tooltip');
 
        var config = (function() {
            var config = null;
            $.ajax({
                url: path + '/config-loader.php',
                data: {
                    "ajax": "true"
                },
                dataType: 'json',
                async: false,
                success: function(response) {
                    config = response;
                },
                error: function() {
                    alert('Ajax error: Edit the path in jcart.js to fix.');
                }
            });
            return config;
        ;
        }());
 
        var setup = (function() {
            if(config.tooltip === true) {
 
                tip.text(config.text.itemAdded);
    
                // Tooltip is added to the DOM on mouseenter, but displayed only after a successful Ajax request
                $('.jcart [type=submit]').mouseenter(
                    function(e) {
                        var x = e.pageY + 25,
                            y = e.pageX + -10;
                        $('body').append(tip);
                        tip.css({top: y + 'px', left: x + 'px'});
                    }
                )
                .mousemove(
                    function(e) {
                        var y = e.pageY + 25,
                        x = e.pageX + -10;
                        tip.css({top: y + 'px', left: x + 'px'});
                    }
                )
                .mouseleave(
                    function() {
                        tip.hide();
                    }
                );
            }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2017, 11:42
Ответы с готовыми решениями:

Ajax работа с async false
Выгружаю данные (li) в ul через ajax - несколько элементов по которым можно кликать, в следствие...

Async/ await как правильно ввести данные в async метод (консоль)
Привет , кто то может помочь ?) проблема в тому что у меня есть async метод который запускается...

std::async(std::launch::async и глобальная g_Future переменная
Весь код давать не буду, достаточно описать логику: 1. Я объявил переменную g_Future глобальной,...

Async Free (СОМ-порт)-Async Pro (СОМ-порт)?
Здравствуйте! Скажите пожалуйста есть пример где используют Async Free (СОМ-порт) или Async Pro...

7
Эксперт JS
2454 / 1761 / 624
Регистрация: 11.07.2016
Сообщений: 4,051
26.04.2017, 12:16 2
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var JCART = (function() {
 
        // This script sends Ajax requests to config-loader.php and relay.php using the path below
        // We assume these files are in the 'jcart' directory, one level above this script
        // Edit as needed if using a different directory structure
        var path = 'jcart',
            container = $('#jcart'),
            token = $('[name=jcartToken]').val(),
            tip = $('#jcart-tooltip');
 
        var config = (function() {
            var config = null;
            $.ajax({
                url: path + '/config-loader.php',
                data: {
                    "ajax": "true"
                },
                dataType: 'json',
                success: function(response) {
                    config = response;
var setup = (function() {
            if(config.tooltip === true) {
 
                tip.text(config.text.itemAdded);
    
                // Tooltip is added to the DOM on mouseenter, but displayed only after a successful Ajax request
                $('.jcart [type=submit]').mouseenter(
                    function(e) {
                        var x = e.pageY + 25,
                            y = e.pageX + -10;
                        $('body').append(tip);
                        tip.css({top: y + 'px', left: x + 'px'});
                    }
                )
                .mousemove(
                    function(e) {
                        var y = e.pageY + 25,
                        x = e.pageX + -10;
                        tip.css({top: y + 'px', left: x + 'px'});
                    }
                )
                .mouseleave(
                    function() {
                        tip.hide();
                    }
                );
            }
                },
                error: function() {
                    alert('Ajax error: Edit the path in jcart.js to fix.');
                }
            });
        ;
        }());
Примерно так. С отступами не заморачивался.

Добавлено через 1 минуту
И скобки отредактируйте. Там явно будет ошибка.
0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
26.04.2017, 12:36 3
Цитата Сообщение от irkprin Посмотреть сообщение
Что за tooltip?
Javascript
1
tip = $('#jcart-tooltip');
Tooltip is added to the DOM on mouseenter, but displayed only after a successful Ajax request
Цитата Сообщение от irkprin Посмотреть сообщение
Uncaught TypeError: Cannot read property 'tooltip' of null
"Не возможно прочитать свойство tooltip в null". То есть он делает null.tooltip. Это значит что setup не определен, по крайней мере в том контексте где он используется
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 4
26.04.2017, 12:53  [ТС] 4
Ошибка исчезла, но страница стала перезагружаться при выполнении скрипта, фактически ajax не работает.

Вот http://conceptlogic.com/jcart/ в исходнике скрипта пополнение корзины идет без перезагрузки страницы.
0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
26.04.2017, 12:58 5
irkprin, когда перезагружается страница это значит что срабатывает отправка html-формы. нужно отключить действие по умолчанию, то есть сделать event.preventDefault() в обработчике события submit формы
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 4
26.04.2017, 13:07  [ТС] 6
Padimanskas, дык он там есть:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        // Add an item to the cart
        $('.jcart').submit(function(e) {
            add($(this));
            e.preventDefault();
        });
 
        // Prevent enter key from submitting the cart
        container.keydown(function(e) {
            if(e.which === 13) {
                e.preventDefault();
            }
        });
 
        // Update an item in the cart
        container.delegate('[name="jcartItemQty[]"]', 'keyup', function(){
            update($(this));
        });
 
        // Remove an item from the cart
        container.delegate('.jcart-remove', 'click', function(e){
            remove($(this));
            e.preventDefault();
        });
0
32 / 32 / 14
Регистрация: 30.11.2013
Сообщений: 139
26.04.2017, 21:23 7
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var config = (function() {
            var config = null;
            $.ajax({
                url: path + '/config-loader.php',
                data: {
                    "ajax": "true"
                },
                dataType: 'json',
                async: false,
                success: function(response) {
                    config = response;
                },
                error: function() {
                    alert('Ajax error: Edit the path in jcart.js to fix.');
                }
            });
            return config;
        ;
        }());
этот код в любом случаем возвращает null дальше не стал смотреть так как тут всё падает)
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 4
26.04.2017, 22:36  [ТС] 8
Убрал все лишнее, ошибок нет, товар в корзину добавляется. Но ajax не работает, страница перезагружается. Вот весь код без лишней лабуды:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// jCart v1.3
// [url]http://conceptlogic.com/jcart/[/url]
 
$(function() {
    var JCART = (function() {
        var path = 'jcart',
            container = $('#jcart'),
            token = $('[name=jcartToken]').val(),
            tip = $('#jcart-tooltip');
 
        var config = (function() {
            var config = null;
            $.ajax({
                url: path + '/config-loader.php',
                data: {
                    "ajax": "true"
                },
                dataType: 'json',
                success: function(response) {
                    config = response;
                    var setup = (function() {
                    // Remove the update and empty buttons since they're only used when javascript is disabled
                    $('#jcart-buttons').remove();
        
                    // Default settings for Ajax requests
                    $.ajaxSetup({
                        type: 'POST',
                        url: path + '/relay.php',
                        success: function(response) {
                            // Refresh the cart display after a successful Ajax request
                            container.html(response);
                            $('#jcart-buttons').remove();
                        },
                        // See: [url]http://www.maheshchari.com/jquery-ajax-error-handling/[/url]
                        error: function(x, e) {
                            var s = x.status, 
                                m = 'Ajax error: ' ; 
                            if (s === 0) {
                                m += 'Check your network connection.';
                            }
                            if (s === 404 || s === 500) {
                                m += s;
                            }
                            if (e === 'parsererror' || e === 'timeout') {
                                m += e;
                            }
                            alert(m);
                        }
                    });
                }());
                },
                error: function() {
                    alert('Ajax error: Edit the path in jcart.js to fix.');
                }
            });
        ;
        }());
 
        
        // If this is not the checkout the hidden input doesn't exist and no value is set
        var isCheckout = $('#jcart-is-checkout').val();
 
        function add(form) {
            // Input values for use in Ajax post
            var itemQty = form.find('[name=' + config.item.qty + ']'),
                itemAdd = form.find('[name=' + config.item.add + ']');
            // Add the item and refresh cart display
            $.ajax({
                data: form.serialize() + '&' + config.item.add + '=' + itemAdd.val(),
                success: function(response) {
                    // Momentarily display tooltip over the add-to-cart button
                    if (itemQty.val() > 0 && tip.css('display') === 'none') {
                        tip.fadeIn('100').delay('400').fadeOut('100');
                    }
                    container.html(response);
                    $('#jcart-buttons').remove();
                }
            });
        }
        // Add an item to the cart
        $('.jcart').submit(function(e) {
            add($(this));       
            e.preventDefault();
        });
    }()); // End JCART namespace
}); // End the document ready function
0
26.04.2017, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2017, 22:36
Помогаю со студенческими работами здесь

Async как добавить?
делаю по образцу с ютуба, но сборки похоже разные... пробую сделать авсинхронизацию но async ни как...

Как работает async await?
Не могу понять как все же отрабатывает async await. Насколько я понимаю их работу сначала должен...

Как использовать async и await
Почему-то async и await не ни в какую не хотят работать... Ошибка CS1061 'Task<string>" не...

Как правильно настроить async await
private async void открытьToolStripMenuItem_Click(object sender, EventArgs e) { ...

Как правильно использовать async await
Здравствуйте! Есть программа, где вывод должен осуществляться при каждой итерации цикла, но этого...

async/await как замена многопоточности
Можно ли использовать эту конструкцию как полную замену потокам, или в каких случаях не получится?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru