gpt4 book ai didi

javascript - 将变量设置为函数的结果,行为非常奇怪

转载 作者:行者123 更新时间:2023-12-02 19:01:55 24 4
gpt4 key购买 nike

我有一个 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');

但是链接最终并不等于之前记录的精彩内容。相反,它包含一个对象数组,但长度不正确。

这里发生了什么?

最佳答案

由于 getLinksFrom 是异步函数,因此当 JS 计算函数调用时,它会立即将结果写入 links 变量。但此时 returnArray 是空的!

看一下图片:

enter image description here

它表明,在将 returnArray 分配给 links 变量之后,并且很可能在使用此变量之后,会发生推送到 returnArray 的情况。

因此,如果您使用异步代码,则不能只执行 a = b()。通常在这种情况下,人们使用回调:b(function(a) {/* do some with a */}) (参数是一种“成功”函数)。因此,您应该重写代码以使用回调异步工作。

但是您的代码还有一个问题:您永远不会停止 self 调用。每次成功请求后,您都会发送另一个请求,并且永远不会停止。也许,在多次请求之后,您将不再获得任何有用的数据,那么为什么要用无用的请求来打扰远程服务器和用户的网络呢?只是完成后不要进行递归。相反,您可以调用 callback 来通知函数调用者您已完成。

关于javascript - 将变量设置为函数的结果,行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com