2016-05-31 94 views
0

我有這樣https://jsfiddle.net/vhzqvx2e/20/ 一些javasctipt代碼如果選擇4個文件,並期待到控制檯,你會看到這個的Javascript「for」循環功能序列

1 
2 
3 
4 
4 
Object { name: "FireShot Capture 4", size: 54714, type: "image/png", preview: "data:image/png;base64,"[…] } 
4 - 
Object { name: "FireShot Capture 4", size: 54714, type: "image/png", preview: "data:image/png;base64,"[…] } 
4 - 
Object { name: "FireShot Capture 4", size: 54714, type: "image/png", preview: "data:image/png;base64,"[…] } 
4 - 
Object { name: "FireShot Capture 4", size: 54714, type: "image/png", preview: "data:image/png;base64,"[…] } 

正如你可以在最前一頁看,我看到滿環控制檯.LOG(this.count);然後我的所有代碼都會在最後一個循環中運行(圖片大小和名稱僅適用於最後一張圖片)。我怎樣才能讓閱讀器和SomeCl.processM(info);在每個循環運行,而不是4次之後?

回答

1
  • 包裝的FileReader對象創建和IIFE函數內部 '負荷' 回調與它自己的詞法範圍

(function(file) { 
       var reader = new FileReader(); 
       reader.onload = function(e) { 
        info.preview = e.target.result; 
        console.log(SomeCl.count + " -") 
        SomeCl.processM(info); 
       }; 
       reader.readAsDataURL(files[i]); 
     })(files[i]); 

https://jsfiddle.net/bfzmm1hc/1

+0

嗯,我得到了在控制檯相同的輸出。 .. 1 2 3 4和4次文件信息 – user1128677

+0

後仍然沒有得到它。的console.log(this.count);並在一個循環中回調(SomeCl.processM(info))。因此,我們進入循環,console.log(this.count)顯示我1,然後它應該運行回調,然後去第二個循環。但是現在我得到了和我的 – user1128677

+0

同樣的結果,它是異步的。 JavaScript是單線程語言,意味着一次只能執行一項任務。循環進行到最後,將i值傳遞給函數。然後才調用函數。然後filereader加載文件,然後才調用回調。 – bfmags