Javascript FileReader()-闭包和传递参数的问题
我对这次活动有几个问题: 以下两个代码段之间得到不同结果的原因是什么?只要我传递Javascript FileReader()-闭包和传递参数的问题,javascript,closures,filereader,Javascript,Closures,Filereader,我对这次活动有几个问题: 以下两个代码段之间得到不同结果的原因是什么?只要我传递对象实例,而不是显式的this.attachmentIndex值,我就会得到不同的结果 1) 2) Closure-FileReader.onload() 我面临的另一个问题是,我似乎无法将多个参数传递给我的FileReader.onload()事件处理程序 fileReader.onload = (function (file, one, two) { return func
对象
实例,而不是显式的this.attachmentIndex
值,我就会得到不同的结果
1)
2)
Closure-FileReader.onload()
我面临的另一个问题是,我似乎无法将多个参数传递给我的FileReader.onload()
事件处理程序
fileReader.onload = (function (file, one, two) {
return function (evt) {
one // 1
two // undefined
};
})(f, 1, 2);
下面你们可以找到整个物体。我不得不做一些丑陋的事情来达到我想要的。我真的希望有更好的方法达到同样的效果
function Note() {
this.attachmentOutput = [];
this.attachmentIndex = 0;
this.debugging = false;
this.currentWorkingObject = new NoteObject(helperFn.createGuid());
this.addAttachement = function(files) {
for (var i = 0, f; f = files[i]; i++) {
var fileReader = new FileReader(),
fileReader.onload = (function (file, obj) {
return function (evt) {
var base64File = evt.target.result;
obj["note"].addDataToAttachementObj(obj["index"], { data: base64File })
};
})(f, { note: this, index: this.attachmentIndex});
// Async => reading file
fileReader.readAsDataURL(f);
this.attachmentIndex++
}
var html = app.outputTemplate(this.currentWorkingObject.attachements);
$('.upload-output').html(html);
};
};
函数的触发器:
$(".upload-drop-zone").on('drop', function (e) {
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
app.myCurrentNote.addAttachement(files);
});
我想要0作为闭包中的索引值的结果-在最后I
明白了,但这是一个丑陋的解决办法。如果我不能通过考试
参数,然后我得到1,我不知道为什么
FileReader
是异步的this.attachmentIndex
似乎在
// Async => reading file
fileReader.readAsDataURL(f);
this.attachmentIndex++ // <- `this.attachmentIndex` incremented to `1` here
//异步=>读取文件
fileReader.readAsDataURL(f);
this.attachmentIndex++//预期的结果是什么?我想要0
作为闭包中索引
值的结果-最后我得到了它,但只是使用了这个丑陋的解决方法。如果我没有显式地传递参数,那么我得到1
,我不知道为什么。如果我能把这个
传递到闭包,然后从那里访问附件索引
,会容易得多。不确定是否正确解释了这个问题?在var i=0,f时,在中为循环设置f
的目的是什么代码>?是否在f=files[i]
中定义了i
?已尝试(var i=0;i{
?它为我节省了检索文件对象的额外麻烦。在代码中我还需要I
,我刚才跳过了这个代码段,因为我认为它不相关。这就是我的想法,但为什么这个
+访问闭包中的索引会给我一个不同的结果,然后将它显式地作为this.att传递achmentIndex
@KingJulien不确定以下内容“为什么this+访问闭包中的索引会给我一个不同的结果,然后将其显式传递为this.attachmentIndex
”正确?尝试从文件读取器.onload
事件中增加此.attachmentIndex
?例如,文件读取器.onload
之前定义它=此;
,在文件读取器.onload
中,在添加数据到AttachmentObj
,+该.attachmentIndex
?
$(".upload-drop-zone").on('drop', function (e) {
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
app.myCurrentNote.addAttachement(files);
});
// Async => reading file
fileReader.readAsDataURL(f);
this.attachmentIndex++ // <- `this.attachmentIndex` incremented to `1` here