我在javascript中有一个函数,它应该返回由维基百科页面链接到的所有文章的数组,给出标题。
这是:
function getLinksFrom(title, returnArray, plcontinue) {
var url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&pllimit=500&plnamespace=0&callback=?';
if (!returnArray) {
returnArray = [];
}
if (!plcontinue) {
plcontinue = '';
}
if (returnArray.length === 0 || plcontinue !== '') {
if (plcontinue !== '') {
url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&pllimit=500&plnamespace=0&plcontinue=' + plcontinue + '&callback=?';
}
$.ajax({url: url,
dataType: 'json',
async: false,
success: function(data) {
for (key in data['query']['pages']) {
links = data['query']['pages'][key]['links'];
}
for (var i = 0; i < links.length; i += 1) {
returnArray.push(links[i]['title']);
}
if (data.hasOwnProperty('query-continue')) {
plcontinue = data['query-continue']['links']['plcontinue'];
} else {
plcontinue = '';
}
console.log(returnArray);
return getLinksFrom(title, returnArray, plcontinue);
}
});
}
console.log(returnArray);
return returnArray;
}
当我运行此函数并观察控制台时,console.log(returnArray);线条把我想要的东西放在控制台里。字符串数组。但在这里我感到困惑。
我想将returnArray存储在名为links的变量中。这是该行,它位于函数之下。
var links = getLinksFrom('United States');
但链接最终并不等于之前记录的那个奇妙的东西。相反,它包含一个对象数组,这不是正确的长度。
这里发生了什么?
答案 0 :(得分:2)
由于getLinksFrom
是异步函数,当JS评估函数调用时,它会立即将结果写入links
变量。但是在那个时间点returnArray
是空的!
看看图片:
它显示在将returnArray
变量分配给links
变量之后推送到a = b()
,并且很可能是在使用此变量之后。
因此,如果您使用异步代码,则无法执行b(function(a) { /* do something with a */ })
。通常在这种情况下,人们使用回调:callback
(参数类似于&#34;成功&#34;函数)。因此,您应该使用回调重写代码以异步工作。
但是你的代码还有一个问题:你永远不会停止自我调用。在每次成功请求之后,您发送另一个请求并且永不停止也许,经过多次请求,您不再获得任何有用的数据,那么为什么要用无用的请求来打扰远程服务器和用户的网络呢?当你完成时,不要做递归。取而代之的是,您可以致电{{1}}通知您的函数来电者您已完成。