Вопрос по jquery, ajax, json – Функция возвращает ответ Ajax - Значение не определено? JQuery Ajax [дубликат]

0

This question already has an answer here:

How do I return the response from an asynchronous call? 33 answers

Когда я оповещаю возвращаемое значение из функции jsonServerResponse, его значение не определено - несмотря на то, что JSON возвращается со страницы process.php.

function jsonServerResponse(operation, JSOoptionalData) {
        JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
        var jqxhr = $.ajax({
            type: "POST",
            url: "process.php",
            data: "apicommand=" + JSOoptionalData,
            success: function (json) {
                return jQuery.parseJSON(json);
            }
        });
}

alert("Response as JS Object: "+jsonServerResponse("operation"));

Я знаю, что проблема в том, что функция оповещения, созданная до завершения асинхронного запроса, не уверена, как решить эту проблему. Любой совет действительно ценится :)

Ваш Ответ

3   ответа
0

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

function jsonServerResponse(operation, callback, JSOoptionalData) {
        JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
        jqxhr = $.ajax({
            type: "POST",
            contentType: "application/json",
            url: "process.php",
            data: "apicommand=" + operation + "&optionaldata" + JSON.stringify(JSOoptionalData),
            dataType: "json",
            success: function (json) {
                if(typeof callback === 'function') callback.apply(this, [json]);
            }
        });
}


jsonServerResponse("get_something_from_server", function(returnedJSO){
     console.log(returnedJSO.Result.Some_data);
}, "optional_data");

И, gdoron, строка, о которой вы спрашивали, делает третий аргумент необязательным. Я слышал, что это хорошая практика, если вы собираетесь передать некоторые данные на сервер (но вы не знаете, сколько переменных), чтобы добавить необязательный аргумент и просто передать объект js, преобразовать его в строку JSON и декодировать его. на стороне сервера.

Мир! :)

1

Вы устранили проблему, ajax - асинхронная операция, вы можете использовать возвращенные данные только в обратном вызове успеха:

function jsonServerResponse(operation, JSOoptionalData) {
    // What that line suppose to do???
        JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
        var jqxhr = $.ajax({
            type: "POST",
            url: "process.php",
            data: "apicommand=" + JSOoptionalData,
            dataType: "json", // Change the dataType to json.
            success: function (json) {
                console.log("Response as JS Object:") 
                console.log(json);
            }
        });
}
5

Это связано с тем, что запрос AJAX является асинхронным, поэтомуreturn ударил до завершения вызова, поэтому функция всегда возвращает ноль.

Вам нужно вызвать код, который основан на вызове AJAX, изsuccess перезвони себе. Попробуй это:

function jsonServerResponse(operation, JSOoptionalData) {
    JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
    var jqxhr = $.ajax({
        type: "POST",
        url: "process.php",
        data: "apicommand=" + JSOoptionalData,
        success: function (json) {
            alert("Response as JS Object: " + json);

            // to see more information about the object returned, use console.log:
            console.log(json);
        }
    });
}

jsonServerResponse("operation")
Есть ли способ захватить данные из запроса в переменную за пределами успешного обратного вызова? TaylorMac
@TaylorMac Вы все еще можете поместить его в глобальную переменную, но вы должны быть очень осторожны, чтобы использовать эту переменную только после завершения вызова AJAX. Лучший способ - вызвать функцию из вашегоsuccess обработчик, передающий результат вызова AJAX.
На 24 сек быстрее меня.

Похожие вопросы