jQuery возвращает неопределенную строку из функции в .each () - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь вернуть строку из функции с именем 'tjekdet', но она не выдаст ничего, кроме неопределенного. Мне просто нужно вернуть строку, чтобы я мог добавить результат к $ (this).

Причина, по которой я так поступаю, заключается в том, что запрос test2.php занимает около 40 секунд, поэтому я бы предпочел сделать их один за другим. Но это неважно.

Это как-то связано с синхронными вызовами? Или я просто упускаю что-то действительно простое?

    function tjekdet(name) {
    $.get("test2.php", { test: name },
        function(data){
        // alert(data); returns correctly in the alert
        return data;
       });
    }

    jQuery(function($) {
        $('.button').live("click",function() {
            $(".navn-list").each(function() {
                var navn = $(this).text();
                var tester = tjekdet(navn);
                alert(tester); // returns undefined
            });
        });

Ответы [ 4 ]

4 голосов
/ 10 февраля 2012

Это как-то связано с синхронными вызовами?

Да.Ну, на самом деле это связано с асинхронными вызовами.Ваша tjekdet функция вернет undefined до того, как ваш AJAX get вернет что-либо.

Поместите предупреждение в обратный вызов успеха:

$.get("test2.php", { test: name }, function(data) {
    alert(data);
    //Do whatever you need to do here, not in the other function
});

Вы можете использовать jQuery.ajax вместо jQuery.get и установите для параметра async значение false, но это редко является хорошей идеей и приводит к полной блокировке браузера до тех пор, пока данные не будут возвращены.

1 голос
/ 10 февраля 2012

get является сокращением для ajax с определенным набором параметров.AJAX асинхронный.Это означает, что запрос еще не вернулся после завершения вашей функции.

Единственная возможность вернуть что-то подобное из get - сделать это синхронным вызовом, что является плохой идеей почти во всех случаях, так как браузер зависает во время ожиданиядля ответа.

Вместо этого вы должны делать все, что вам нужно, с результатом запроса в вашем обратном вызове.

0 голосов
/ 10 февраля 2012

Вот так должен выглядеть ваш код:

function tjekdet(name, callback) {
    $.get("test2.php", { test: name },
        function(data){
            callback(data);
    });
}

jQuery(function($) {
    $('.button').live("click",function() {
        $(".navn-list").each(function() {
            var navn = $(this).text();
            tjekdet(navn, function(data){
                alert(data);
            });
        });
    });
});

внутри tjekdet ваш ajax-вызов является асинхронным, и вы можете выполнить какое-либо действие, когда этот вызов завершится ... но поскольку tjekdet вернется сразу же, вы не можете ожидать получения правильного значения из tjekdet, но вам следует вызвать некоторые метод обратного вызова вместо.

0 голосов
/ 10 февраля 2012

Потому что tjekdet() на самом деле ничего не возвращает. Оператор return в tjekdet действительно принадлежит анонимному обратному вызову и не имеет ничего общего с возвратом tjekdet.

Кроме того, обратный вызов внутри tjekdet вызывается асинхронно, поэтому он, вероятно, даже не будет выполнен при вызове alert(tester);.

...