2016-06-09 56 views
0

我正在使用readAsDataURL將blob轉換爲base64。問題是,我做了一個循環:將參數傳入FileReader的onloadend函數

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; 
} 

所以我的第一個問題是我可以用我所有的斑點一樣的讀者?如果是的話,我怎麼能通過指數到我的onloadend函數?

如果我不能使用同一個閱讀器,我該如何解決這個問題?

回答

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對象和回調的陣列功能。該函數使用一個具有onload處理函數的FileReader,它不斷遞增索引並讀取傳入數組中的下一個對象。索引始終可用,因爲此邏輯在閉包中執行,而不是for循環。一旦索引增加到與傳入的對象數組相同的長度,您的回調將通過作爲參數傳遞的變異對象數組來執行。這個回調應該保持你想要執行的邏輯,一旦所有的blob被轉換爲base64。

希望這會有所幫助!

+1

我發現這個非常好的解決方案:http://stackoverflow.com/questions/4404361/html5-file-api-get-file-object-within-filereader-callback?rq=1 – ncohen