我的输出有问题。 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
...
答案 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?