我正在使用for each方法迭代一系列命令文件。
对于每个命令文件,我需要等待ajax成功,然后继续执行下一个命令。
问题是for a循环在ajax代码完成之前移动到下一个命令。任何人都可以提供解决方案吗?
对于每个循环:
$.each(cmd_files, function(index, cmd) {
update_log('Running CMD for' + cmd)
wait_for_cmd_complete(cmd).done(function(data){
update_log("CMD is complete");
})
})
Ajax功能:
function wait_for_cmd_complete(cmd){
return $.ajax({
type: 'POST',
data: {cmd:cmd},
url: 'wait_for_cmd_complete.php'
});
}
答案 0 :(得分:1)
这就是我最终开始工作的原因。
第一个Ajax请求已完成。
使用i ++高级cmd文件数组。
从同一个函数中再次调用Ajax函数。
如果仍有更多文件要运行,则再次调用该函数,
在最后一个cmd文件完成后退出函数。
can :read, User, User.published do |user|
true
end
}
答案 1 :(得分:1)
根本不是你如何编写事件驱动的动作。如果您需要下一次代码迭代才能在事件之后启动,那么您就不会遍历迭代...因为这将在事件之前运行所有代码!这就是事件的运作方式。
制作类似这种通用结构的东西,可以更好地在每个事件中运行1次迭代代码:
var i = 0; // the index we're using
var list = []; // array of the things you plan on "looping" through
var max = list.length; // basically how many iterations to do
function nextIteration() {
if (i >= max) return; // end it if it's done
// do whatever you want done before the event for this iteration
list[i].addEventListener("someevent", onEvent); // add whatever event listener
}
function onEvent() {
// do whatever it is you want done after the event for this iteration
i++; // up the index
nextIteration(); // start the next iteration
}
nextIteration(); // start the first iteration manually
为了便于说明,您可以了解正在进行的操作,此处的代码格式与上述代码类似。
var i = 0; // the index we're using
update_log('Running CMDs');
var cmd; // basically a var just so we don't have to keep calling cmd_files[i]
var totalCommands = cmd_files.length; // basically how many iterations to do
function sendNextCommand() {
if (i >= totalCommands) return; // end it if it's done
cmd = cmd_files[i]; // again, just so we don't have to keep calling cmd_files[i]
update_log("Waiting for CMD " + cmd + " to complete...");
$.ajax({type:'POST', data:{cmd:cmd}, url:'wait_for_cmd_complete.php'}).done(onCommandComplete);
// above line does what needs to be done (sends to PHP) and then adds the event listener 'done'
}
function onCommandComplete(value) {
update_log( " CMD complete for: " + cmd);
i++; // up the index
sendNextCommand(); // start the next iteration
}
sendNextCommand(); // start the first iteration manually
答案 2 :(得分:0)
也许尝试链接你的活动。不太熟悉这种方法,但我认为这样可行:
$.each(cmd_files, function(index, cmd) {
update_log('Running CMD for' + cmd);
var request = $.ajax({type: 'POST',data: {cmd:cmd}, url: 'wait_for_cmd_complete.php'});
request.then( update_log("CMD is complete");
});
答案 3 :(得分:0)