Jquery 在$之后调用函数。每个方法

Jquery 在$之后调用函数。每个方法,jquery,arrays,asynchronous,each,Jquery,Arrays,Asynchronous,Each,我正在使用数组上的$.each方法将文件保存到本地文件夹。一旦.each方法处理完数组中的最后一个文件,如何执行函数。方法不起作用 function downloadStartData() { $.each(startUpimageFilesArray, function (index, entry) { saveTofolder(entry.addy, entry.nameOfFile) });

我正在使用数组上的$.each方法将文件保存到本地文件夹。一旦.each方法处理完数组中的最后一个文件,如何执行函数。方法不起作用

 function downloadStartData() {
        $.each(startUpimageFilesArray,
            function (index, entry) {
                saveTofolder(entry.addy, entry.nameOfFile)
            });       
 };
 function saveTofolder(url, fileName) {
        try {
             WinJS.xhr({
                url: url,
                responseType: "blob",
             }).done(
                function writeBlobToFile(result) {
                var blob=result.response;
                var lFolder = Windows.Storage.ApplicationData; 
                var storeOption = Windows.Storage.CreateCollisionOption;
                lFolder.current.localFolder.createFileAsync(fileName, storeOption.replaceExisting
             ).then(function(file) {
               file.openAsync(Windows.Storage.FileAccessMode.readWrite
              ).then(function(output) {
                  var input = blob.msDetachStream();
                  Windows.Storage.Streams.RandomAccessStream.copyAsync(input, output
               ).then(function () output.flushAsync(
                ).then(function () {
                   input.close();
                       output.close();
                  )};
               )};
             )};
          )};
        )};
  }
catch (e) {
    WinJS.log && WinJS.log("Exception while using XMLHttpRequest object 
    " + e, "sample", "error");
        }
};

每个
都是同步的

saveToFolder
中有异步代码。您可以将回调传递给当前迭代完成后将调用的
saveToFolder

function downloadStartData() {
    var len = startUpimageFilesArray.length;
    function callback() {
        len--;
        if(len==0) {
            // Write your "done" code here!
        }
    }
       $.each(startUpimageFilesArray,
           function (index, entry) {
               saveTofolder(entry.addy, entry.nameOfFile, callback)
           });       
};

// ... 
                ).then(function () {
                  input.close();
                      output.close();
                      callback(); 
                 )};
// ...
你最内在的然后
saveToFolder
中的函数可以完成它。您只需在所有保存完成后确认调用了函数。因此,您可以传递另一个函数来指示当前完成的保存是否是最后一个,如果是,则执行您的函数

下面是一个如何执行此操作的示例:

// add a new parameter "fnCompleted" to your saveTofolder
function saveTofolder(url, fileName, fnCompleted){ 
    // some other operation omited
    // below is the most inner then
    .then(function () {
         input.close();
         output.close();
         fnCompleted();
    });
}

function downloadStartData() {
    var allFilesCount = startUpimageFilesArray.length, completed = 0;
    function checkIfCompleted(){
        completed++;

        // if this is the last one, do the work
        if(completed >= allFilesCount){
            // do something
        }
    }

    $.each(startUpimageFilesArray,
        function (index, entry) {
            saveTofolder(entry.addy, entry.nameOfFile, checkIfCompleted)
    });
 };

调用代码必须有某种方式等待
saveToFolder
完成。您可以让它返回一个承诺:

function saveTofolder(url, fileName) {
        var deferred = $.Deferred();
        try {
             WinJS.xhr({
                url: url,
                responseType: "blob",
             }).done(
                function writeBlobToFile(result) {
                var blob=result.response;
                var lFolder = Windows.Storage.ApplicationData; 
                var storeOption = Windows.Storage.CreateCollisionOption;
                lFolder.current.localFolder.createFileAsync(fileName, storeOption.replaceExisting
             ).then(function(file) {
               file.openAsync(Windows.Storage.FileAccessMode.readWrite
              ).then(function(output) {
                  var input = blob.msDetachStream();
                  Windows.Storage.Streams.RandomAccessStream.copyAsync(input, output
               ).then(function () output.flushAsync(
                ).then(function () {
                   input.close();
                       output.close();
                   deferred.resolve();
                  )};
               )};
             )};
          )};
        )};
  }
catch (e) {
    WinJS.log && WinJS.log("Exception while using XMLHttpRequest object 
    " + e, "sample", "error");
    deferred.fail();
        }
    return deferred.Promise();
};
现在,您可以使用
jquery.map
来创建返回承诺的数组,而不是
jquery.each

function downloadStartData() {
        var promises = $.map(startUpimageFilesArray,
            function (entry, index) {
                return saveTofolder(entry.addy, entry.nameOfFile)
            }); 
        return $.when(promises); // Returns a new promise that waits for all of them to complete   
 };

您是否希望在“所有文件均已完成保存”或“上次文件已开始保存”时运行代码?@AlexeiLevenkov-当所有文件均已完成保存时。从saveToFolder方法返回每个文件的新承诺,在save方法的最后一部分中,在
close
旁边标记promise complete,然后等待所有promise都用类似或jQuery的东西完成