0

如果有这个 jQuery 脚本将文件从 ftp 服务器 1 移动到 ftp 服务器 2。它确实有效,但我想一个一个移动文件,而不是一次移动所有文件。不用“async=false”冻结浏览器..

 <script>
    var files = new Array();
    files[1]="testfile1.txt";
    files[2]="testfile2.txt";
    files[3]="testfile3.txt";


    $('#button').click(function() {
      $.each( files, function( key, value ) {
        jQuery.ajax({
        url: '/move.php',
        method: 'GET',
        data: {
        file: value
        },
        success: function(data) {
          $('#'+ key).html(data);
        }
      })
    });
  });
  </script>
4

2 回答 2

1

创建一个函数,该函数将获取files数组中的下一项,执行 AJAX 调用,然后在该successAJAX 调用的回调中调用自身。

var files = new Array(), key = 1;
// arrays are generally indexed starting at 0, but I left the below as is
files[1]="testfile1.txt";
files[2]="testfile2.txt";
files[3]="testfile3.txt";


function moveFile() {
    if(key < files.length) { // there's a next element
        var value = files[key];
        $.ajax({
            url: '/move.php',
            method: 'GET',
            data: {
                file: value
            },
            success: function(data) {
                $('#' + key++).html(data);
                moveFile();
            }
        });
    }
}

$('#button').click(moveFile);

我考虑使用files.pop();来获取下一个元素,但由于我不确定您是否希望数组在运行后保持完整,所以我决定跟踪索引以访问它们。

于 2013-04-18T12:43:57.493 回答
1

你可以递归地做到这一点:

var files = new Array();
    files[1]="testfile1.txt";
    files[2]="testfile2.txt";
    files[3]="testfile3.txt";

$('#button').click(function() { moveFile(files); });


function moveFile(fileArray) {
  var currentFile = fileArray.shift();
  $.ajax({
    url: '/move.php',
    method: 'GET',
    data: {
      file: currentFile
    }
  }).done(function () {
    if(fileArray.length > 0)
      moveFile(fileArray);
  });
}
于 2013-04-18T12:44:13.267 回答