2016-05-31 63 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