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

    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, и в отладчике не отображаются ошибки. И я серьезно чуть не швырнул свой ноутбук об стену. Если кто-то может помочь мне сделать это, пожалуйста, ответьте! Заранее спасибо.

0
user1055350 20 Ноя 2011 в 00:05
1
Какие проблемы, серьезные или нет, у вас есть? Использовали ли вы консоль JavaScript для выявления проблем, были ли сообщения об ошибках?
 – 
David Thomas
20 Ноя 2011 в 00:07
Что этот код пытается выполнить. Что у вас НЕ работает?
 – 
Keith.Abramo
20 Ноя 2011 в 00:07
Возможный дубликат Не удается получить правильное возвращаемое значение из jQuery Ajax-вызов. Дубликат касается асинхронных вызовов, но основная проблема та же: вы возвращаетесь из анонимной функции, а не из основной функции.
 – 
JJJ
20 Ноя 2011 в 00:08
1
Нам нужно знать, какая у вас проблема. Например, я вижу, что в вашей функции success вы используете значение search_return, но вы передаете data в функцию и не используете его.
 – 
Michael Berkowski
20 Ноя 2011 в 00:08
Что ж, извините за это, я обещаю, что отредактирую это. Проблема в том, что из этой проклятой функции ничего не выходит и ничего не сообщается! В конце просто появляется undefined.
 – 
user1055350
20 Ноя 2011 в 00:10

4 ответа

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;
}
2
rossipedia 20 Ноя 2011 в 00:11
Точно! Но как написать JSON в приложении на стороне сервера?
 – 
user1055350
20 Ноя 2011 в 00:17
@Hogan: Немного по-другому. Вы используете dataType: 'script', я использую dataType: 'json', что радикально меняет способ интерпретации данных, передаваемых в обратный вызов.
 – 
rossipedia
20 Ноя 2011 в 00:21
@ user1055350: Это совершенно отдельная проблема, и, вероятно, ее следует опубликовать как еще один вопрос.
 – 
rossipedia
20 Ноя 2011 в 00:22
Я думаю, вы могли бы сказать, что это другое, однако ОП явно не понимал закрытие, что было основной проблемой и, по крайней мере, объяснено в моем ответе.
 – 
Hogan
20 Ноя 2011 в 00:25

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

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

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

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

...

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

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

1
Dave Newton 20 Ноя 2011 в 00:13
Однако он установил async: true.
 – 
flesk
20 Ноя 2011 в 00:15
Я думаю, вы имеете в виду false. Но это не означает, что возврат значения из обработчика success возвращает значение из объемлющей функции. Я также предполагаю, что ОП сделал это, пытаясь сделать то, что, по его мнению, он делал, а не потому, что это должно быть или должно быть синхронным.
 – 
Dave Newton
20 Ноя 2011 в 00:17
Да, это то, что я имел в виду. :$ Я согласен с вами в этом, как я также написал в своем ответе. И да, это, вероятно, причина.
 – 
flesk
20 Ноя 2011 в 00:21

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

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

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

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

doSomethingWithKeywords(keywords);

EDIT: Hogan - хорошее решение, поскольку ваш вызов не является асинхронным.

1
flesk 20 Ноя 2011 в 00:22

Проблема, с которой вы столкнулись, заключается в том, что возврат, который вы передаете, не является возвратом функции - это возврат события успеха. Часто для решения этой проблемы в 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;
}
0
Hogan 20 Ноя 2011 в 00:16
search_return["keywords"] выглядит так, как должно быть data["keywords"]
 – 
Michael Berkowski
20 Ноя 2011 в 00:10