1

这个想法是在没有服务器超时的情况下生成一堆缩略图。所以我用 jQuery 用 ajax 来一一做。

我有一个通过一组文件名运行的 JavaScript 循环,并要求服务器为每个文件生成一个图像。在这种情况下,大约有 300 多个文件。

我浏览我的文件并使用单独的函数来执行 ajax 请求。顶部循环想要显示当前正在处理的文件。但是在顶部循环运行时,页面似乎挂起。为什么?(如您所见,我试图在调用 ajax 之前等待一秒钟,但这并没有成功。)

    function mkImgAll() {
        $.ajaxSetup({ async: true });
        var files = $('.files');
        debugClear();
        for(i=0;i < files.length;i++) {
            var id=files[i].id;
            var file=files[i].value;
            debugSay(id+' '+file);     // <- This does not display 
            sleep(1000);               //                until the  
            mkImg(id, file);           //        loop has finished.
        }
        $.ajaxSetup({ async: ajaxAsyncDefault });
    }

    function mkImg(id, file){
        $('#ajaxWaiting').show(1);
        $.ajax({
            type : 'POST',
            url : 'includes/ajax.php',
            dataType : 'json',
            async: false,
            data: {
                'proc' : 'makeOneThumb',
                'id' : id,
                'file' : file
            },

顺便说一句,debugSay 函数这样做:

    function debugSay(say) {
        if(debug) {
            $("#debugMessage").append("<xmp>"+say+"</xmp>");
        }
    }
4

3 回答 3

2
$.ajax({
....
async: false,

您的请求不是异步的。您应该将 async 设置为 true,从 jquery 1.7 开始不推荐使用 async: false !

于 2012-06-28T16:18:21.167 回答
0

我会尝试使用 setTimeout 调用调试...

于 2012-06-28T16:19:42.057 回答
0

远射,但你可以试试这个:

if (debug) {
    var dummy = $("#debugMessage").append("<xmp>"+say+"</xmp>").get(0).offsetLeft;
}

这应该在浏览器锁定到 sleep() 之前强制刷新页面。最好使用setTimeout()而不是sleep()那个顺便说一句,除非你的循环真的必须在那里暂停。

于 2012-06-28T16:23:55.143 回答