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