JavaScript for循环阻止继续,直到上传完成

时间:2012-10-22 00:59:46

标签: javascript jquery for-loop jquery-forms-plugin

要上传多个文件,我使用JavaScript循环遍历文件。 要上传我正在使用jQuery表单插件http://archive.plugins.jquery.com/project/form

的文件

现在,当循环运行时,它会立即运行到循环结束,并一次性上传所有文件。

有没有办法让循环在每次上传时保持不变?

这是使用循环的示例(实际代码非常大)

for(i=0;i<=num;i++)
{
    if(go1){
        <?php //if 1 upload only, hide add and upload button ?>
        $('#ad,#ok').hide();
        var z=i;
        $('#up'+i).ajaxSubmit({
            dataType:"json",
            beforeSubmit:function(before){
                $('#loadingsignup').show;
                $("#resultsignup").empty().hide();
            },
            success:function(retour){
                res=retour;
                if(num<1){  <?php // only one upload, redirect if uploaded correct, reintroduce upload button if error ?>
                    if(res.ok=="ok"){
                        window.location.replace('<?php echo $config['baseurl']; ?>/player/'+res.aid);
                    }else{
                        $('#rs'+z).append('<div class="pasgood">'+res.err+'</div>').show();
                        $('#ad,#ok').show();
                    }
                }
            }
        }); 

    }
}

我真的需要循环来逐个浏览上传。

2 个答案:

答案 0 :(得分:2)

不,循环是同步的,而上传是异步的。如果您希望上传一个接一个地发生,您将需要从第一个成功回调中触发第二个等。

function upload(i, suc, err) {
    if (i > num)
        return suc();
    $('#up'+i).ajaxSubmit({
        dataType:"json",
        beforeSubmit:function(before){
            $('#loadingsignup').show();
            $("#resultsignup").empty().hide();
        },
        success:function(res){
            if(res.ok=="ok"){
                $('#ad,#ok').show();
                upload(i+1, suc, err); // next one
            } else {
                $('#rs'+i).append('<div class="pasgood">'+res.err+'</div>').show();
                err(res.err); // or continue with the rest?
            }
        },
        error: err
    });
}
upload(0, function allDone(){
    window.location.replace('<?php echo $config['baseurl']; ?>/player/');
}, function somethingWrong(){ … });

答案 1 :(得分:-1)

使用async: false作为$.ajax()参数。这将避免一次发送文件,$.ajax将等待请求的执行完成,循环将继续到下一个项目。

DOCS: 默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用完整/成功/错误回调。

但无论如何你需要同步执行。