Все еще возникают проблемы с возвратом значения через функцию - PullRequest
0 голосов
/ 20 ноября 2011

У меня серьезные проблемы с приведенной ниже функцией:

    function requestUploadedSearch()
    {
        var cookie = JSON.parse(readCookie("user_search_cookie"));
        $.ajax({
            dataType: "script",
            async: false,
            data: {
                context: "search-get",
                code: removeNull(cookie, cookie !== null, "code")
            },
            success: function(data)
            {
                var keywords = search_return["keywords"];
                return keywords; // here is the damn problem.
            }
        });
    }

Похоже, что из этой функции просто ничего не выходит, кроме значения undefined , и ошибки не отображаются вотладчик.И я серьезно почти бросаю свой ноутбук на стене.Если кто-то может помочь мне в этом, пожалуйста, ответьте!Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 20 ноября 2011

1-й выключен: где переменная search_return? Почему ты игнорируешь data?

У меня такое чувство, что вы хотите это сделать:

function requestUploadedSearch()
{
    var cookie = JSON.parse(readCookie("user_search_cookie"));
    var keywords;
    $.ajax({
        dataType: "json",
        async: false,
        data: {
            context: "search-get",
            code: removeNull(cookie, cookie !== null, "code")
        },
        success: function(data)
        {
            keywords = data["keywords"];
        }
    });
    return keywords;
}
1 голос
/ 20 ноября 2011

Проблема в том, что, поскольку вызов Ajax будет завершен в произвольное время в будущем, вы не можете просто вернуть значение из его обработчика success.

Одна проблема заключается в том, что вы на самом деле этого не делаетечто-то с data, возвращаемым сервером, что кажется озадачивающим.

В двух словах: вам нужно реализовать эту функциональность как часть обратного вызова success.Это можно сделать в потоке, или вы можете создать функцию обратного вызова вне самого вызова Ajax и использовать ее в качестве значения для свойства success:

function onSuccess(data) {
    // Do something with the data here
}

...

$.ajax({ // etc.
    success: onSuccess
};

Вы также можете использовать Функция jQuery $ .when .

1 голос
/ 20 ноября 2011

Проблема в том, из какой области вы пытаетесь вернуть ваши ключевые слова.Функция успеха вызывается jQuery, и вы не можете контролировать, что jQuery делает с этим возвращаемым значением.Вы могли бы сделать return $.ajax(..., но не получили бы того, что ожидали, так как согласно документации: «Начиная с jQuery 1.5, метод $ .ajax () возвращает объект jqXHR, который является надмножеством объекта XMLHTTPRequest» (http://api.jquery.com/Types/#jqXHR).

Вместо этого вы должны настроить функцию обратного вызова, например:

function doSomethingWithKeywords(keywords) {
    // do stuff
};

, и в функции успеха вызвать эту функцию:

doSomethingWithKeywords(keywords);

РЕДАКТИРОВАТЬ: Hogan's - хорошее решение, поскольку ваш вызов не асинхронный.

0 голосов
/ 20 ноября 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что возвращаемый вами результат не является возвращением функции - это возвращение события успеха.Часто замыкания (подразумеваемая передача локальной переменной в функцию) используются для решения этой проблемы в JavaScript.

NB Я все еще не думаю, что ваша функция будет работать, потому что я неПосмотрите, где search_return["keywords"] определяется.Но, по крайней мере, вам не придется беспокоиться о проблеме закрытия.Как только ваша функция успеха будет правильной, основная функция вернет ее.

Например:

function requestUploadedSearch()
{
    var cookie = JSON.parse(readCookie("user_search_cookie"));
    var returnClosure;
    $.ajax({
        dataType: "script",
        async: false,
        data: {
            context: "search-get",
            code: removeNull(cookie, cookie !== null, "code")
        },
        success: function(data)
        {
            // returnClosure = data["keywords"];
            returnClosure = search_return["keywords"];
        }
    });
    return returnClosure;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...