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) устарело; Вы должны использовать полные / успешные / ошибочные обратные вызовы.
Но в любом случае вам нужно синхронное исполнение.