Javascript问题与打印到屏幕的顺序

时间:2015-08-05 07:54:53

标签: javascript jquery html

我的输出有问题。 getYammerJSON包含一个也附加的行。问题在于,当我运行脚本时,它首先放入不在函数内部的所有附加,然后是函数的内容,是否与准备就绪有关?

<div id="test"></div>

_

$(function(){

    while(n<len){
    $('#test').append("<br/><br/>Yammer Group ID: <b>" + groupIDs[n] + "<b/><br/><br/>");
    getYammerJSON(page,n)
    n++;
    }

});

    function getData(returnData){
    $.each(returnData.users, function(key, value){
        if(value.email != undefined){
            $('#test').append(value.email + "<br/>");
        }
    });
}

function getYammerJSON(page,n){
    $.get("https://www.yammer.com/api/v1/users/in_group/" + groupIDs[n] + ".json?page=" + page, function (returnData) {
        getData(returnData);

        if(!returnData.more_available === true){
            return false;
        }
        else {
            page++;
            getYammerJSON(page,n);
        }
    });

}

一个例子(它应该按组ID分开电子邮件,而不是放在顶部) -

Yammer Group ID: 12069



Yammer Group ID: 46371

adetan@test.com
alanild@test.com
alexchi@test.com
alisoc@test.com
alwyn@test.com
...

1 个答案:

答案 0 :(得分:2)

这是一个异步问题。你希望这些功能能够互相激发。他们没有。 jQuery get是异步的。所以它在请求准备好时触发,而不是在函数完成时触发。这会导致数据出现在错误的位置。您需要重新考虑填充#test的方式。

这里的解决方案将解决异步问题。

function getYammerJSON(page,n){
    if (!$('#yg_'+n)[0]) //test if the div already exists, if not create.
    {
        $('#test').append("<div id='yg_"+n+"'>Yammer Group ID: <b>" + groupIDs[n] + "<b/></div><br/>");
    }
    $.get("https://www.yammer.com/api/v1/users/in_group/" + groupIDs[n] + ".json?page=" + page, function (returnData) {
        getData(returnData, n);

        if(!returnData.more_available === true){
            return false;
        }
        else {
            page++;
            getYammerJSON(page,n);
        }
    });

}

function getData(returnData, n){
$.each(returnData.users, function(key, value){
    if(value.email != undefined){
        $('#yg_'+n).append(value.email + "<br/>");
    }
});

现在每次调用getYammerJSON时,如果它不存在,它将在#test内创建一个新的div。 div被赋予一个引用n值的ID。调用getData时,它会将地址附加到始终与正确的组ID对应的正确div中。

  

异步迫使您重新考虑数据检索策略。它更多地依赖于回调。拐角处有新技术。评论中提到了它们,但它们远非常见做法。直到那天你需要应用回调才能使异步工作没有错误。

     

点击此处了解详情:Asynchronous vs synchronous execution, what does it really mean?