每个循环完成后运行一个jquery函数

时间:2014-01-23 22:38:07

标签: javascript jquery

我有一种情况,我正在运行一个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

感谢任何帮助。

2 个答案:

答案 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减少。