2015-12-13 4 views
-2

У меня есть этот скрипт, который работает (не в части if), чтобы проверить размер изображения. картина должна под 300x300 и этот сценарий всегда возвращает ложь (даже для 100x100 изображений)javascript var in inested function as event

function validate_dimention(fileName) { 
    input = document.getElementById("profilepic"); 
    file = input.files[0]; 
    var reader = new FileReader(); 
    var image = new Image(); 
    var width; 
    var height; 
    reader.readAsDataURL(file); 
    reader.onload = function(pic) { 
     image.src = pic.target.result; 
     image.onload = function() { 
      width = this.width; //panjang 
      height = this.height; //lebar 
     } 
    } 
    if (width <= 300 && height <= 300) { 
     return true; 
    } else { 
     console.log(width); 
     console.log(height); 
     return false; 
    } 
} 

журнал консоли всегда возвращается и как неопределенный (так код не имеет синтаксиса EROR) ,, есть способ так ширина равно // panjang и height равно // lebar ??

+0

Или другой дублирует http://stackoverflow.com/questions/14220321/how-do-i-return- a-response-from-a-асинхронный вызов –

+0

Невозможно «вернуть» результат на основе информации, полученной только асинхронным событием. Событие фактически не произойдет, чтобы установить информацию до тех пор, пока 'return' уже не предоставил значение. –

+0

@JonathanLonowski извините, но на самом деле не понял вашу идею. Полный код был в https://codeshare.io/jscript, я не могу проверить его перед отправкой? – Vins

ответ

3

Это потому, что onload является событием и является асинхронным. Он будет вызываться после загрузки изображения. Просто переместите условие внутри функции onload, чтобы решить эту проблему. Но из-за этого асинхронного вызова вы не сможете напрямую использовать любое значение return. Вы должны будете использовать обратный вызов, где вы будете делать код в зависимости от результата:

function validate_dimention(fileName, callback) { 
    input = document.getElementById("profilepic"); 
    file = input.files[0]; 
    var reader = new FileReader(); 
    var image = new Image(); 
    var width; 
    var height; 
    reader.readAsDataURL(file); 
    reader.onload = function(pic) { 
     image.src = pic.target.result; 
     image.onload = function() { 
      width = this.width; //panjang 
      height = this.height; //lebar 
      if (width <= 300 && height <= 300) { 
       callback(true); 
      } else { 
       callback(false); 
      } 
     } 
    } 
} 

// And you call it that way : 
validate_dimention(fileName, function (result) { 
    // Do whatever you want, using result as the result of your function. It 'll be either true or false. 
}); 
+0

Хорошо, что вызовет вызовы 'console.log()', но в целом функция все равно не будет делать то, что хочет OP. – Pointy

+0

Я только что увидел это, отредактировав свой ответ –

+0

@NathanP. Я двигаю его и все еще не работаю ... :( – Vins