getJSON中的数组推送

时间:2016-06-28 13:28:07

标签: javascript jquery scope

我在ahref链接上使用以下函数作为onclick事件:

function checkOrgSaved() {
   var orgName = $.trim($("#orgName").val());
   var orgNames = new Array();

    $.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token,   function (result) {
        for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
            var org = result.Orgs[i].name;
            orgNames.push(org);
        }
    });

    if ($.inArray(orgName, orgNames) == -1 || orgName == 0){
        alert("Foobar.");
        $("#editLink").attr("href", "javascript:void(0);");
    }
}

像这样,orgNames语句中的if数组始终为空。为什么呢?

但是,如果我在orgNames调用中声明getJSON数组并将if语句也放在getJSON()调用中,则数组会正确填充,但该行$("#editLink").attr("href", "javascript:void(0);");不起作用,只需单击ahref元素即可执行重定向。

我想要实现的目标是:如果orgName数组中的orgName为空或NOT,则应抛出JS警报 - 在另一页上没有重定向。

4 个答案:

答案 0 :(得分:1)

这是因为$.getJSON调用是异步的,这意味着{<1}}语句将在收到JSON数据之前执行并执行回调并{{1}填充。

您可能想要在点击发生之前获取JSON并填充数组,然后再次检查值:

if

这也有助于避免对相同JSON数据的其他请求。

答案 1 :(得分:0)

尝试将代码更改为:

    function checkOrgSaved() {
       var orgName = $.trim($("#orgName").val());
       var orgNames = new Array();
       $.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token,   function (result) {
            for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
                var org = result.Orgs[i].name;
                orgNames.push(org);
            }
            if ($.inArray(orgName, orgNames) == -1 || orgName == 0){
              alert("Foobar.");
              $("#editLink").attr("href", "javascript:void(0);");
        }
        });   
    }

答案 2 :(得分:0)

作为第二个参数传递给$.getJSON的函数是一个回调,它将在异步HTTP调用完成后执行

$.getJSON之后的代码会立即执行,这意味着当您尝试通过数组访问结果时,回调很可能还没有运行。

您必须将更新UI的逻辑移动到回调函数中,以确保HTTP调用在执行时已完成。

function checkOrgSaved() {
   var orgName = $.trim($("#orgName").val());
   var orgNames = new Array();

    $.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token,   function (result) {
        for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
            var org = result.Orgs[i].name;
            orgNames.push(org);
        }

        if ($.inArray(orgName, orgNames) == -1 || orgName == 0){
            alert("Foobar.");
            $("#editLink").attr("href", "javascript:void(0);");
        }
    });
}

有关详细信息,请查看at jQuery's docs

答案 3 :(得分:0)

Javascript是一种asynchronous语言,对吗?发生的事情是你的if语句在get函数的回调返回结果之前运行。

您应该将if check移动到这样的回调中:

$.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token, function(result) {
    for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
        var org = result.Orgs[i].name;
        orgNames.push(org);
    }
    if ($.inArray(orgName, orgNames) == -1 || orgName == 0) {
        alert("Foobar.");
        $("#editLink").attr("href", "javascript:void(0);");
    }
});