Javascript отказывается что-либо возвращать

#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