我有一种情况,我正在运行一个jquery函数,在该函数中我有一个每个循环。每个循环都需要一些时间进行处理,这就是下一个语句在每次完成之前执行的原因。这给我带来了麻烦。我想要一个函数在每个完成时执行。我的功能如下: -
function myFunc() {
// Do something
$.each(mylist, function (i, val) {
// do something
filepicker.store(myList, function (stored_fpfile) {
console.log("Store successful:", JSON.stringify(stored_fpfile));
}, function (FPError) {
// Error
}, function (progress) {
console.log("Loading: " + progress + "%");
}
);
});
CallMyFunction();
}
在每个循环结束之前调用我的函数。
我不想使用列表的计数来检测和运行我的程序。我想要一个可靠的解决方案。
我正在使用InkFilePicker API将文件存储到Amazon
感谢任何帮助。
答案 0 :(得分:0)
我建议为每次迭代生成延迟对象,然后将其存储在数组中。然后,在每个之后,您可以等到所有延迟对象完成后再运行其他功能。
function myFunc() {
// Do something
var promiseArray = $.map(mylist, function (i, val) {
return $.Deferred(function(def){
// do something
filepicker.store(val, function (stored_fpfile) {
def.resolve(stored_fpfile);
}, function (FPError) {
def.reject(FPError);
}, function (progress) {
def.notify(progress); // won't actually be accurate
});
}).promise();
});
$.when.apply($,promiseArray).done(function(){
console.log(arguments); // array of results from onSuccess callbacks
CallMyFunction();
})
}
答案 1 :(得分:0)
显然,商店是AJAX对象的包装器。您应该测试进度以及何时完成调用CallMyFunction,就像调用每个进程之前一样:
items = myList.length;
在每个内部:
...
function (progress) {
console.log("Loading: " + progress + "%");
if (--items === 0)
{
CallMyFunction();
}
}
...
没有任何反驳论据,性能不受此影响,您通过互联网发送数据是真正的瓶颈。
这也很可靠。如果出现错误,您应该使用--items减少。