将参数传递给FileReader的onloadend函数

时间:2016-06-09 00:51:02

标签: javascript asynchronous filereader

我使用readAsDataURL将blob转换为base64。问题是我在循环中这样做了:

var reader = new FileReader();

for(var index in objects){
   reader.readAsDataURL(objects[index].blob);
}

reader.onloadend = function() {
   // need to pass my index here
   objects[index].base64 = reader.result;
}

所以我的第一个问题是我可以为所有blob使用相同的阅读器吗?如果是,我如何将索引传递到我的onloadend函数?

如果我不能使用同一个阅读器,我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

现在,我承认我的答案写得非常快,因为我的笔记本电脑很快就死了,但我相信下面的代码可以解决你的问题。

function readAllBlobs(objects, callback) {
    var index = 0;
    var reader = new FileReader();

    function readBlob(object) {
        reader.readAsDataURL(object.blob);
    }

    var readBlobHandler = function () {
        // the index is available here.
        objects[index].base64 = reader.result;

        index++;
        if (index == objects.length) {
            // all objects have been read, fire callback on mutated objects array.
            callback(objects);
            return;
        }

        readBlob(objects[index]);
    }

    reader.onload = readBlobHandler;

    readBlob(objects[index]);
}

我原以为你可以编写一个接受blob对象数组和回调函数的函数。该函数使用单个FileReader和onload处理程序,该处理程序不断递增索引并读取传入的数组中的下一个对象。索引始终可用,因为此逻辑在闭包内执行而不是for循环。一旦索引增加到与传入的对象数组相同的长度,就会以作为参数传递的mutated objects数组执行回调。所有blob转换为base64后,此回调应保留您要执行的逻辑。

希望这有帮助!