javascript - 如何将多个异步 $.get 请求的结果存储在数组中?
问题描述
我有一个存储在数组中的项目列表。对于数组中的每个项目,我需要发出一个 API 请求并将一些返回到另一个数组中的数据添加,以便稍后可以对其执行操作。
我认为问题在于我的获取请求是异步的,因此当我尝试将数据添加到数组时不一定会加载数据,但我认为这.then
就是应该涵盖的内容。
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 对象添加到数组中,然后您可以$.when()
在所有请求完成后应用该数组来执行一些其他逻辑。
在请求本身中,您需要将返回的数据添加到数组中,因为您无法从异步调用中返回任何内容。
综上所述,您的代码将如下所示:
var cardRequestList = ["Scapeshift", "Ghostform", "Daybreak Chaplain"]
var url = "https://api.magicthegathering.io/v1/cards?name=%22";
var cardInfo = [];
var requests = cardRequestList.map(function(cardName) {
return getCard(cardName);
});
function getCard(cardName) {
var cardUrl = url.concat(cardName, "%22");
return $.get(cardUrl).then(function(data) {
cardInfo.push([data.cards[0].name, data.cards[0].printings]);
}, function() {
alert("$.get failed!");
});
}
$.when.apply($, requests).done(function() {
// all requests finished and cardInfo has been populated, place logic here...
console.log(cardInfo);
});
推荐阅读
- rest - 返回相同资源但使用不同 DTO 时命名 REST 资源的最佳方法是什么?
- spring-boot - 如何根据标签更新 MicroMeter 量规
- c# - 将 Content-Type 添加到 Swashbuckle 获取请求
- php - Laravel 6.2:我从 index() 方法中的不同数据中获得相同的 ID
- r - ggplot中的问题,连续x轴为年份
- javascript - 由数组表示的状态:我在添加数组和保持状态变量与数组的总和之间得到不同的值
- css - 仅使用 CSS 隐藏 WordPress 主页上的元素
- garbage-collection - v8 的 IncrementalMarking 和 ProcessWeakCallbacks 垃圾回收有什么作用?
- java - 如何生成具有两个自增字段的复合键并在第一个字段更改时重置第二个字段
- solr - Apache solr 搜索多个字段而不指定字段名称