在Javascript

时间:2016-10-22 10:00:00

标签: javascript jquery ajax

我有一个方法发送AJAX请求并返回一个结果,指示JSON string代币记录,我试图获得此结果并将其分配给名为{的全局变量{1}}然后在其他函数中重用此全局变量。

我将结果分配给该变量并将其记录到控制台,如下所示:

tokens

问题在于,当我将结果分配给变量然后将其记录到控制台时,它会成功显示结果,但是当我想稍后在其他函数中重用它时,它表明变量仍然是{{1 }}

例如,我想在以下var tokens = null; function PopulateAllTokens() { $.ajax({ type: "POST", url: "NewToken.aspx/PopulateAllTokens", contentType: "application/json; charset=utf-8", dataType: "json", error: function (XMLHttpRequest, textStatus, errorThrown) { alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown); }, success: function (result) { tokens = JSON.parse(result.d); console.log(tokens); populateTokensToTable(tokens); } }); } 代码中使用它,但它显示该变量为null:

null

只是为了澄清变量和函数都在里面定义:

jQuery

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

确保在全局使用变量之前完成AJAX回调

当您尝试通过AJAX获取值然后尝试在整个$.ajax()构造之外使用该值时,大多数时候会出现问题。原因是异步调用的响应只能在successcomplete回调中安全访问 - 无法保证在完成其中任何一个回调之前填充该值。要解决此问题,您可以移动以下代码以从AJAX回调中调用,或者等待回调设置全局变量。

使用回调继续运行脚本

var tokens = null;

function PopulateAllTokens() {
    $.ajax({
        type: "POST",
        url: "NewToken.aspx/PopulateAllTokens",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
        },
        success: function (result) {
            tokens = JSON.parse(result.d);
            console.log(tokens);
            populateTokensToTable(tokens);

            EverythingElseYouWantToRun();
        }
    });
}

function EverythingElseYouWantToRun() {

    // you can do whatever you want with the response here

    $("#example").DataTable({
        "columns": getTokens(),
        "data": tokens
    });
}

使用您的消费脚本等待变量

var tokens = null;

function PopulateAllTokens() {
    $.ajax({
        type: "POST",
        url: "NewToken.aspx/PopulateAllTokens",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
        },
        success: function (result) {
            tokens = JSON.parse(result.d);
            console.log(tokens);
            populateTokensToTable(tokens);
        }
    });
}

function RunWhenVariableIsPopulated(variable, callback, timeout) {

    if (variable === null) {

        setTimeout(function() {

            RunWhenVariableIsPopulated(variable, callback, timeout);
        }, timeout);

    } else {

        callback(variable);
    }
}

然后你可以打电话:

RunWhenVariableIsPopulated(tokens, function() {
    $("#example").DataTable({
        "columns": getTokens(),
        "data": tokens
    });
}, 400 /* or whatever your average round-trip time is*/);

注意:如果您的AJAX响应时间非常长,这会导致浏览器显着挂起,并有效地将异步调用转换为同步调用。希望这有助于您当前的情况!

答案 1 :(得分:1)

function getData(){
return $.ajax({
            type: "POST",
            url: "NewToken.aspx/PopulateAllTokens",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: false,
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
            },
            success: function (result) {
                tokens = JSON.parse(result.d);
                console.log(tokens);
                populateTokensToTable(tokens);
            }
        }).responseText;
}

var res = getData();

上面的代码会将响应存储在变量中,之后您可以解析它并根据需要进行修改。我不确定,但它可以帮到你

答案 2 :(得分:0)

使用$ .parseJSON()方法

$(document).ready()没关系,只有函数调用流,你也可以在外面声明函数并相应地调用它,并且还可以检查变量是否为null

var tokens = null;

function PopulateAllTokens() {
            $.ajax({
                type: "POST",
                url: "NewToken.aspx/PopulateAllTokens",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
                },
                success: function (result) {
                    tokens = $.parseJSON(result.d);
                    console.log(tokens);
                    populateTokensToTable(tokens);
                }
            });
        }

    if(tokens)
       console.log(tokens);