我使用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
函数?
如果我不能使用同一个阅读器,我该怎么做才能解决这个问题?
答案 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后,此回调应保留您要执行的逻辑。
希望这有帮助!