所有延期完成后调用方法?

pan*_*hro 5 javascript jquery promise jquery-deferred

我有这门课:

(function(){
"use strict";

var FileRead = function() {
    this.init();
};


p.read = function(file) {

    var fileReader = new FileReader();
    var deferred = $.Deferred();

    fileReader.onload = function(event) {
        deferred.resolve(event.target.result);
    };

    fileReader.onerror = function() {
        deferred.reject(this);
    };

    fileReader.readAsDataURL(file);

    return deferred.promise();

};

lx.FileRead = FileRead;
}(window));
Run Code Online (Sandbox Code Playgroud)

该类在循环中调用:

var self = this;
    $.each(files, function(index, file){
        self.fileRead.read(file).done(function(fileB64){self.fileShow(file, fileB64, fileTemplate);});

    });
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法在循环完成后调用一个方法,并且self.fileRead已经返回循环中的所有内容?

即使一个或多个延迟失败,我希望它调用该方法.

Rob*_*evy 3

$.when 可以让你将多个 Promise 包装成一个。其他 Promise 库也有类似的东西。构建 fileRead.read 返回的 Promise 数组,然后将该数组传递给 $.when 并将 then/done/fail/always 方法连接到 .when 返回的 Promise

    // use map instead of each and put that inside a $.when call
    $.when.apply(null, $.map(files, function(index, file){
        // return the resulting promise
        return self.fileRead.read(file).done(function(fileB64){self.fileShow(file, fileB64, fileTemplate);});

    }).done(function() {  

      //now everything is done 
    })
Run Code Online (Sandbox Code Playgroud)