【发布时间】:2017-06-26 15:57:27
【问题描述】:
我对 JSON 和 Deferrers 有点陌生,所以很抱歉答案很明显。
我正在与 pokeapi.co 合作,我正在尝试使用 getJSON 提取各种 pokemon 的详细信息。我创建了一个函数,它接受一个 URL 数组,运行一个 getJSON 函数从 URL 中提取数据,迭代数据并将其推送到一个数组中。我正在尝试使用 defer 对象并承诺确定所有操作何时完成,以便我可以在另一个函数中使用数据。不幸的是,我似乎做错了什么。
var url = [
"http://pokeapi.co/api/v2/pokemon/1/",
"http://pokeapi.co/api/v2/pokemon/2/"
];
function getPokemonDetails(url){
var def = $.Deferred();
var promises = [];
var pokemon;
$.each(url, function(i, index){
var deferred = $.Deferred();
$.getJSON(index, function(data){
pokemon = [data.name, data.stats];
var abilityURLs = [];
$.each(data.abilities, function(a, abilities){
abilityURLs.push(abilities.ability.url)
});
pokemon.push(abilityURLs);
deferred.resolve(pokemon);
}); //End getJSON
deferred.done(function(data){
promises.push(data);
console.log(promises);
})// End Deferred
}); //End Each
$.when(...promises).done(function(){
console.log(arguments.length);
});
}
getPokemonDetails(url);
目前,当 console.log 运行时,我预计 promises 数组的长度为 2,但此时它返回 0。我不确定我到底哪里出错了。
【问题讨论】:
-
在创建 promise 数组时,.map 通常是正确的工具。您立即需要一系列承诺,这是您问题的一部分;在承诺完成之前,您不会推送到数组,这是不正确的。
-
并且当使用
$.getJSON时,在它们周围创建自己的 jQuery 延迟对象通常是一种反模式 -
另外,你不需要
$.Deferred,$.getJSON 已经返回了一个承诺。
标签: jquery promise getjson jquery-deferred