Javascript 如何在一个数组中存储多个异步$.get请求的结果?
我有一个存储在数组中的项目列表。对于数组中的每个项,我需要发出一个API请求,并添加一些返回到另一个数组中的数据,以便以后可以对其执行操作 我认为问题在于我的get请求是异步的,因此当我试图将数据添加到数组中时,数据不一定被加载,但我认为这就是Javascript 如何在一个数组中存储多个异步$.get请求的结果?,javascript,jquery,Javascript,Jquery,我有一个存储在数组中的项目列表。对于数组中的每个项,我需要发出一个API请求,并添加一些返回到另一个数组中的数据,以便以后可以对其执行操作 我认为问题在于我的get请求是异步的,因此当我试图将数据添加到数组中时,数据不一定被加载,但我认为这就是应该涵盖的内容 var cardRequestList = ["Scapeshift","Ghostform", "Daybreak Chaplain"] var url = "https://api.magicthegathering.io/v1/ca
应该涵盖的内容
var cardRequestList = ["Scapeshift","Ghostform", "Daybreak Chaplain"]
var url = "https://api.magicthegathering.io/v1/cards?name=%22";
var cardInfo =[];
for (var cardName in cardRequestList){
var results = getCard(cardRequestList[cardName]);
cardInfo.push(results);
}
console.log(cardInfo); // results should come back here
function getCard(cardName){
var cardUrl = url.concat(cardName,"%22");
$.get(cardUrl).then(
function(data) {
var temp = [data.cards[0].name,data.cards[0].printings]
return temp;
}, function() {
alert( "$.get failed!" );
}
);
}
then()
要解决这个问题,您可以在循环中发出请求,将这些调用返回的jqXHR对象添加到一个数组中,然后将该数组应用于$。当()完成所有请求后,执行一些其他逻辑
在请求本身中,您需要将返回的数据添加到数组中,因为您无法从异步调用返回任何内容
尽管如此,您的代码看起来是这样的:
var cardRequestList=[“替罪羊”、“幽灵形态”、“黎明牧师”]
变量url=”https://api.magicthegathering.io/v1/cards?name=%22";
var cardInfo=[];
var requests=cardRequestList.map(函数(cardName){
返回getCard(cardName);
});
函数getCard(cardName){
var cardUrl=url.concat(cardName,“%22”);
返回$.get(cardUrl).then(函数(数据){
push([data.cards[0]。名称,data.cards[0]。打印];
},函数(){
警报(“$获取失败!”);
});
}
$.when.apply($,requests).done(函数(){
//所有请求都已完成且cardInfo已填充,请将逻辑放在此处。。。
console.log(cardInfo);
});
您的。然后()
将覆盖单个请求,但为了等待多个请求,您需要Promise.all()
。如果在$.get(…
之前放置一个return
,则可以将for循环替换为Promise.all(cardRequestList.map(getCard))。然后(results=>…)
@Taplar我重新打开了它,因为常见的重复目标与OP要求的不完全一样。他们已经正确处理了一个请求,他们的目标是合并多个请求中的数据。@RoryMcCrossan你确定吗?getCard方法不返回任何内容。它不起作用,但OP正在尝试:返回temp
a然后将push()[cardName];
返回为未定义。此时,我认为cardName
是一个字符串。我将其更改为getCard(cardName)
,这似乎解决了问题。但是,在修复后,我注意到一些奇怪的情况。数组cardInfo
似乎返回了6个元素(而不是我预期的3个),前三个是未定义的。这比我最初得到的要好,但仍然有些奇怪。这是我一直在做的小提琴的链接:再次感谢你的帮助。对不起,我的错误。我已经为你更新了答案再次感谢你的帮助。我仍然认为行返回getCard(cardRequestList[cardName];
需要更改为返回getCard(cardName);
。除此之外,我仍然有问题。在你的$.when.apply..
函数中,有一个控制台.log(cardInfo)
。当我打开控制台运行此代码时,它会立即返回[]
。当我展开它时,它包含正确的数据,但有一条消息说,下面的值刚刚计算过
。如果我将其更改为警报(cardInfo);
,警报返回为空。该函数调用时,cardInfo
似乎仍然没有填充。我已稍微更新了小提琴: