这是实际情况的一个例子。为了我的目的,我需要返回一个赋值给一个在onload事件处理程序中初始化的变量的值。它返回undefined。有没有办法返回变量?
在这种情况下,我需要从usefile函数返回元素变量。如何管理它。
<html>
<body>
<input type='file' id='up' accept='image/*' >
<script>
function fileread(e){
if(window.FileReader && window.File && window.FileList){
var file=e.target.files[0];
var getElement=usefile(file);
console.log(getElement); // prints 'undefined'
}
}
function usefile(file){
var reader=new FileReader();
reader.onload=function(e){
var element=getRandomElement();
return element; // need to return it and assign it to getElement variable inside fileread function
}
}
function getRandomElement(){
var arr=[1,2,3];
return arr[2]; // a random value for experiment purpose
}
document.getElementById('up').addEventListener('change',fileread,false);
</script>
</body>
</html>
答案 0 :(得分:1)
当您同步执行所有操作时,返回值。您的案例中的异步部分来自读取文件所需的延迟。因此,您为其提供了一个在读取文件后调用的函数。
这意味着您还需要构建代码,以便稍后调用在读取文件后必须执行的部分。因此,您还需要将该逻辑移动到回调中。
简而言之,使用回调。这是一种方式......
function fileread(e) {
if (window.FileReader && window.File && window.FileList) {
var file = e.target.files[0];
var getElement = usefile(file, function() {
console.log(getElement); // does not print 'undefined'
});
}
}
function usefile(file, callback) {
var reader = new FileReader();
reader.onload = function(e) {
var element = getRandomElement();
callback(element);
}
}
function getRandomElement() {
var arr = [1, 2, 3];
return arr[2]; // a random value for experiment purpose
}
document.getElementById('up').addEventListener('change', fileread, false);
<input type='file' id='up' accept='image/*'>
答案 1 :(得分:1)
尝试使用FileReader
onloadend
事件
<html>
<body>
<input type='file' id='up' accept='image/*'>
<script>
var reader, result = [];
if (window.FileReader && window.File && window.FileList) {
reader = new FileReader();
function fileread(e) {
var file = e.target.files[0];
var getElement = usefile(file);
reader.onloadend = function(e) {
console.log(result)
}
}
function usefile(file) {
reader.onload = function(e) {
var element = getRandomElement();
// push `element` , `e.target.result` to `result` array
result.push(element, e.target.result)
}
reader.readAsDataURL(file)
}
function getRandomElement() {
var arr = [1, 2, 3];
var r = arr[Math.floor(Math.random() * arr.length)];
return r; // a random value for experiment purpose
}
document.getElementById('up').addEventListener('change', fileread, false);
} else {
alert("FileReader not supported")
}
</script>
</body>
</html>
或者,使用Promise
<html>
<body>
<input type='file' id='up' accept='image/*'>
<script>
function fileread(e) {
if (window.FileReader && window.File && window.FileList) {
var file = e.target.files[0];
var getElement = usefile(file);
getElement.then(function(data) {
console.log(data[0], data[1])
})
}
}
function usefile(file) {
return new Promise(function(resolve) {
var reader = new FileReader();
reader.onload = function(e) {
var element = getRandomElement();
// resolve `Promise` with `element` , result of `FileReader`
resolve([element, e.target.result])
// return element;
// need to return it and assign it to getElement variable
// inside fileread function
}
reader.readAsDataURL(file)
})
}
function getRandomElement() {
var arr = [1, 2, 3];
var r = arr[Math.floor(Math.random() * arr.length)];
return r; // a random value for experiment purpose
}
document.getElementById('up').addEventListener('change', fileread, false);
</script>
</body>
</html>