【问题标题】:Jquery: Ajax request looks synchronous, locking the browserJquery:Ajax 请求看起来是同步的,锁定浏览器
【发布时间】:2013-11-06 15:23:01
【问题描述】:

我的 Ajax 调用有一些问题。我需要显示大量来自 json 文件的数据,但是这个过程会锁定整个选项卡或浏览器。

我正在将 2.5MB 的单词加载到一个 div 中。当它正确异步运行时,它应该可以正常工作。还是 2.5MB 对浏览器来说太大了?

我的目标是让浏览器在加载时保持响应。我可以在函数运行时创建加载屏幕,但这是以后的问题。

这是我的代码:

function returnWords() {
            var input2 = '', chr = '';
            for (var i = 65; i <= 90; i++) {
                input2 = String.fromCharCode(i);
                chr = input2.toLowerCase();
                console.log(chr);

                $.ajax({
                    url: 'words/words_' + chr + '.json',
                    dataType: 'json',
                    async: true,
                    success: function(words) {
                        console.log(chr + ' done');
                    }
                });
                var w = "";
                w = words.join();
                var output = w.split(',').join('<br />');
                $('.result').append(output);
            } 
            console.log('done');
        };

【问题讨论】:

  • 您是否有机会在输入字段中的每个按键上运行此命令?
  • 在最新版本的 jquery 中不需要async 属性。 250万也是一个大数据
  • 不,这只是一个点击按钮执行的函数
  • @PraveenJeganathan,它也会在没有该属性的情况下锁定。我正在使用 jQuery 1.9.1
  • @Forza 它仍然在 for 循环内。

标签: javascript jquery ajax asynchronous synchronous


【解决方案1】:

假设你没有做这么多,你会得到一个堆栈溢出,这看起来更适合写成递归

function returnWords() {
    var w = [], output; // share these over each step
    function step(i) {
        var chr;
        if (i <= 90) { // more chrs to go
            chr = String.fromCharCode(i).toLowerCase();
            console.log(chr);
            $.ajax({
                url: 'words/words_' + chr + '.json',
                dataType: 'json',
                success: function (words) {
                    console.log(chr + ' done');
                    w = w.concat(words); // save for later
                    step(i + 1);
                }
            });
        } else {
            output = w.join().split(',').join('<br />');
            $('.result').append(output);
            console.log('done');
        }
    }
    step(65);
}

这段代码一次只会触发一个REQUEST,每个都在前一个之后,直到它到达末尾。

【讨论】:

  • 具有讽刺意味的是,我在这个网站上的问题中遇到了堆栈溢出 :)
  • 效果差不多。它仍然锁定:(
  • 我尝试加载的数据量是不是太大而无法处理?
  • 这个锁在什么阶段?我可以在这个网站上使用它(稍作调整),它可以很好地循环每个字母。
  • 控制台输出显示每个 chr + 'done'。还显示了最终的“完成”。我的猜测是它在将输出附加到结果 div 的最后阶段锁定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多