Цикл 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();
                    }
                }
            }
        }); 

    }
}

Мне действительно нужен цикл для перемещения по загрузкам по одной за раз.


person JimmyBanks    schedule 22.10.2012    source источник
comment
можно использовать setTimeout для задержки каждой последовательности загрузки, но о задержке можно только догадываться, так как не будет никакой обратной связи для оценки прогресса. Вероятно, вам больше повезет с загрузчиком swf   -  person charlietfl    schedule 22.10.2012
comment
вероятно, проблема с масштабом. посмотрите, может ли это вам помочь: stackoverflow.com/questions/ 12552803/ и stackoverflow.com/a/1562293/982924   -  person RASG    schedule 22.10.2012


Ответы (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(){ … });
person Bergi    schedule 22.10.2012
comment
Просто хотел добавить такую ​​реализацию, потому что только что понял, что async: false больше не поддерживается в версии 1.8 ... так это должно работать с версией 1.8. Просто, может быть, он должен перейти к следующей загрузке, даже если предыдущая не удалась - я думаю, также следует добавить upload(i+1, suc, err); в обработчик ошибок. - person Reflective; 22.10.2012
comment
Спасибо, сэр, это имеет смысл. - person JimmyBanks; 22.10.2012

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

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

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

person Reflective    schedule 22.10.2012
comment
не могли бы вы немного подробнее рассказать о том, что вы имеете в виду? - person JimmyBanks; 22.10.2012
comment
async: false устарело в jQuery ajax - person charlietfl; 22.10.2012
comment
это правда, но в любом случае ответ показывает путь... запрос должен быть синхронным для поочередного выполнения. - person Reflective; 22.10.2012
comment
в 1.8 должны обрабатываться обратные вызовы успеха и ошибки, т.е. выполнять следующую загрузку, когда предыдущая завершается с ошибкой или успехом - person Reflective; 22.10.2012