2015-06-09 3 views
0

У меня есть функция здесь, которая проверяет, если изображение имеет размеры 100 на 100 пикселей, и если это так возвращает истинуУстановки логического возвращаемого значения вызова функции JQuery

function checkDims(url) { 
    var valid = $("<img/>").attr("src", url).load(function() { 
     s = { w: this.width, h: this.height }; 
     if (s.w == 100 && s.h == 100) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    }); 
    return valid; 
} 

Я хочу, чтобы установить переменный действительный, который проверяет с помощью .load function to get the image size of a remote URL, и я хочу, чтобы он вернул true или false соответственно. Я знаю, что настраиваю его на объект jQuery, но хочу получить результаты от внутренней функции.

Я попытался сделать:

function checkDims(url) { 
    var valid; 
    $("<img/>").attr("src", url).load(function() { 
     s = { w: this.width, h: this.height }; 
     if (s.w == 100 && s.h == 100) { 
      valid = true; 
     } 
     else { 
      valid = false; 
     } 
    }); 
    return valid; 
} 

Но он дал мне неопределенными в качестве значения действительны, когда я назвал checkDims функционировать

так, если бы я назвал

Var S = checkDims (a_url)

. Он вернется

неопределенные

+1

Нагрузка - это асинхронный вызов, вы не можете вернуться из асинхронного вызова. К тому времени, когда установлено значение true или false, функция уже вышла. – epascarello

+0

Как бы это решить. Если возможно? Нужна ли функция setInterval для ожидания? – BDillan

+1

Вам необходимо изменить свою логику, чтобы обратный вызов срабатывал на следующем этапе вашего процесса. – epascarello

ответ

1

Вам нужно разбить логику в два этапа, так как это асинхронный вызов.

function checkDims(url, callback) { 
    $("<img/>").attr("src", url).load(function() { 
     callback (this.width == 100 && this.height == 100); 
    }).on("error") { callback(false); }); 
} 

function nextStep(isValid) { 
    alert("The image is " + ((isValid) ? "" : "not ") + "valid" 
} 

checkDims("foo.gif", nextStep); 
+0

Итак, функция nextStep должна возвращать true или false? если я хочу установить var result = checkDims ("foo.gif", nextStep)? – BDillan

+0

Вы не можете вернуться! От асинхронного вызова невозможно вернуться. Вам нужно сломать свою логику, поэтому, что бы вы ни делали после вызова checkDims, нужно быть в функции nextStep. – epascarello

+0

Итак, нет способа установить checkDims для результата обратного вызова nextStep? – BDillan