JavaScript для цикла не позволяет продолжить до завершения загрузки

Чтобы загрузить несколько файлов, я использую 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 ответа

Решение

Нет, цикл является синхронным, а загрузка - асинхронной. Если вы хотите, чтобы загрузка происходила одна за другой, вам нужно будет запустить вторую из успешных обратных вызовов первой и т. Д.

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(){ … });

Использование async: false как $.ajax() пары. Это позволит избежать отправки файлов сразу, $.ajax будет ожидать завершения запроса, после чего цикл будет продолжен до следующего пункта.

DOCS: по умолчанию все запросы отправляются асинхронно (т.е. по умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Междоменные запросы и dataType: запросы "jsonp" не поддерживают синхронную работу. Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, когда запрос активен. Начиная с jQuery 1.8, использование async: false с jqXHR ($.Deferred) устарело; Вы должны использовать полные / успешные / ошибочные обратные вызовы.

Но в любом случае вам нужно синхронное исполнение.

Другие вопросы по тегам