【发布时间】:2014-11-06 19:28:33
【问题描述】:
I 3 个函数 a()、b() 和 c() 将在循环中执行 x 次,如下所示: 我必须调用函数 a(); a() 完成后,我必须等待 s1 秒才能调用函数 b();经过 s1 秒后,我必须调用函数 b(); b() 完成后,我必须等待 s2 秒才能重新开始循环。
for(var i=0; i<x; i++) {
a();
setTimeout(b,s1);
setTimeout(function() {},s2);
}
但是,上述循环函数 a() 和 b() 无法正确执行。无论之前的功能是否完成,它们都会执行。
我也尝试过:
var FunctionOne = function () {
// create a deferred object
var r = $.Deferred();
// do whatever you want (e.g. ajax/animations other asyc tasks)
a();
setTimeout(function () {
// and call `resolve` on the deferred object, once you're done
r.resolve();
}, s1);
// return the deferred object
return r;
};
var FunctionTwo = function () {
b();
};
for(var i=0; i<x; i++) {
setTimeout(FunctionOne().done(FunctionTwo),s2);
}
但它没有按预期工作。
你能帮帮我吗?
编辑
函数a()和b()如下:
function a() {
$.ajax({
type: $('#form1').attr('method'),
url: 'Misura',
data: $('#form1').serialize(),
beforeSend: function() {
if($.trim($('#nomeMisura').val()) == "") {
alert('<%= labels.getString("nomeMisuraObbligatorio") %>');
$('#nomeMisura').val("");
return false;
}
},
success: function (data) {
$('#misura').attr('disabled', true);
$('#pulisci').attr('disabled', false);
misurazioneInCorso = true;
}
});
}
function b() {
$.ajax({
type: $('#form1').attr('method'),
url: 'Pulisci',
data: $('#form1').serialize(),
success: function (data) {
var numeroCampioniMisurazione = Number(data.delta.campione2) - Number(data.delta.campione);
//visualizzo in tabella le misurazioni
$('#tabellaMisurazioni').append('<tr id="Misurazione"><td>'+data.nomeSessione+'</td><td>'+data.nome+'</td><td>'+data.delta.campione+'</td><td>'+data.delta.campione2+'</td><td>'+numeroCampioniMisurazione+'</td><td>'+data.delta.f1+'</td><td>'+data.delta.f2+'</td><td>'+data.delta.f3+'</td><td>'+data.delta.f4+'</td><td>'+data.delta.f5+'</td><td>'+data.delta.f6+'</td><td>'+data.delta.f7+'</td><td>'+data.delta.f8+'</td><td>'+data.delta.f9+'</td><td>'+data.delta.f10+'</td><td>'+data.delta.f11+'</td><td>'+data.delta.f12+'</td><td>'+data.delta.t1+'</td><td>'+data.delta.t2+'</td><td>'+data.delta.to+'</td><td>'+data.delta.ft+'</td><td>'+data.delta.rh+'</td></tr>');
$('#tabellaMisurazioni tbody tr:first').html('<td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td><td>---</td>');
$('#misura').attr('disabled', false);
$('#pulisci').attr('disabled', true);
$('#esportaCsvMisurazioni').attr('disabled', false);
$('#nomeMisura').val('');
misurazioneInCorso = false;
}
});
}
所以,我认为 a() 和 b() 是异步函数。
【问题讨论】:
-
第二种方法中什么不符合预期?
a是同步的还是异步的?
标签: javascript jquery loops settimeout deferred