#javascript #return
#javascript #Возврат
Вопрос:
getGood = function(v,x) {
$.getJSON('json/products.json', function(data) {
$.each(data, function(key, val) {
if (v.toLowerCase() == key.toLowerCase()) {
$.each(val.products, function(ckey, cval) {
if (x.toLowerCase() == ckey.toLowerCase()) {
var dval=new Date().getDay();
var qHash=hex_md5(v x qs('cst') dval).toLowerCase();
if (qHash == qs('hash')) {
return dval;
} else {
window.location.replace('/errors/418.html');
}
}
});
}
});
});
}
$(document).ready(function() {
var owner=getGood(qs('cat'),qs('subp'));
alert(owner==null);
$('.content_title').html(qs('subp'));
$('.description').html(owner.descripion);
})
Приведенный выше код должен считывать файл JSON, сравнивать некоторые строки запроса для проверки достоверности, а затем возвращать объект, если запрос действителен. Проблема в том, что независимо от того, что я делаю, getGood
отказывается возвращать какое-либо значение моей owner
переменной. Я пытался заставить его возвращать разные значения вокруг него. Я просто пытался заставить его вернуть все, что мог. Он должен вернуться cval
. Однако предупреждение внизу всегда говорит «undefined / null».
Редактировать
Потому что, по-видимому, люди думают, что я просто такой отсталый:
ДА, он переходит к оператору return . Да, QHash == qs (‘hash’), я не прошу вас проверять каждый if / loop / etc . Я уже знаю, что все это работает. Я спрашиваю, почему мой оператор return в конечном итоге не устанавливает owner
то, что он должен.
Комментарии:
1. У вас есть все эти условия. Если, циклы… только в одном случае возвращается значение. Просто отладьте код и посмотрите, где что-то пошло не так. Как мы должны догадаться отсюда?
2. Я бы рискнул предположить и сказал, что
qHash
это не равноqs('hash')
.3. Извините, вы подумали, что я думал, что вы отсталый. Позвольте мне заверить вас, что я так не думаю.
4. @Golez, извините, я был немного раздражен тем, что люди предполагали что-то. Я думал, что лучше объяснил это в своем посте. Это была моя ошибка.
Ответ №1:
Обратный вызов, переданный в «$.getJSON()», выполняется асинхронно. Поэтому просто невозможно вернуть значение из него.
Вместо этого передайте код, который должен воздействовать на значение в качестве параметра функции. Затем функция обратного вызова может передать значение в эту функцию в качестве параметра.
function getGood(v, x, handleOwner) {
$.getJSON('json/products.json', function(data) {
$.each(data, function(key, val) {
if (v.toLowerCase() == key.toLowerCase()) {
$.each(val.products, function(ckey, cval) {
if (x.toLowerCase() == ckey.toLowerCase()) {
var dval=new Date().getDay();
var qHash=hex_md5(v x qs('cst') dval).toLowerCase();
if (qHash == qs('hash')) {
handleOwner(dval); // calling the handler function here
} else {
window.location.replace('/errors/418.html');
}
}
});
}
});
});
}
//
getGood(qs('cat'),qs('subp'), function(owner) {
alert(owner);
});
Комментарии:
1. Вау, это сработало отлично. Я даже не думал о том, что это проблема! Спасибо!
2. Рад, что это сработало! Это действительно распространенный шаблон в JavaScript.
3. Не только потому, что он асинхронный. Другие функции обратного вызова могут быть синхронными, но они все равно не заставят основную функцию возвращать значение.
4. @GolezTroi да, это совершенно верно — возврат (был) похоронен внутри двух вызовов «$.each ()».
Ответ №2:
JavaScript ничего не «отказывается возвращать». Вы просто не просите об этом.
Вы делаете
var owner=getGood(qs('cat'),qs('subp'));
но getGood
не return
имеет никакого значения. Единственный return
оператор находится function (key, val)
внутри getGood
, который возвращает из этой функции, а не из getGood
.
Комментарии:
1. Ааааа, тоже хороший момент! Pointy не упоминал об этом, я вижу в этом еще одну проблему. К счастью, ответу Pointy это не мешает. 1