我创建了一个函数,通过像这样的
这样的Promise进行一系列API调用//userApiList is a variable with an array of links
return Promise.all(userApiList.map(url =>{
var a = $.getJSON(url);
//userData is a global variable
userData.push(a);
return a;
}));
我想将数据保存到变量供以后使用,并立即将其返回以使用jquery迭代到html中。一切都按预期完美加载,但是当我去访问变量中的数据时,我得到所有“未定义”属性。我在console.log中记录了变量,它显示了数据,我在获取数据后点击按钮,这不是异步问题。这是其中一个函数
的示例$("#load_online").click(function(){
var users = [];
for(var i = 0; i < userData.length; i++){
var status = userData[i].status;
if(status !== null || status !== undefined){ users.push(userData[i]); }
}
$("#result_frame").empty();
//loadUsers() iterates the data into html
loadUsers(users);
});
我尝试console.log(userData[i].status)
只是为了看看结果会是什么,当我想要200
或者在频道上播放的剧集的标题时,我得到了null'
作为回复
问题是我认为responseJSON:
字段总是返回使用,因为我之前从未涉及过这个问题。这一次似乎整个对象都被读取,因此userData[i].status
正在向上读取status:
属性,而不是在responseJSON:
对象内。我试图从userData[i].responseJSON.status
中获取响应并且为每个对象返回undefined。有人容易看出我做错了什么吗?如果您需要仔细研究一下,这里是整个项目的CodePen。
答案 0 :(得分:3)
您没有将数据推送到您的阵列中,您正在推送一个jQuery jqXHR对象( thenable ,例如Promise-like进入它($.getJSON
的返回值是什么)。 Promise.all
结果有效的原因是Promise.all
等待那些可以解决的问题。
你很可能根本不想拥有userData
全球。相反,要求数据从Promise.all
返回的承诺上的解析处理程序获取所需的代码。
但如果你真的想填充userData
,请等待解决:
return Promise.all(userApiList.map($.getJSON))
.then(results => {
userData.push(...results);
return results;
});
请注意userData
在ajax请求完成之前(当然)不会有数据。
上述结果不会将结果添加到userData
,直到他们全部 avaialble。你也可以随意填充它:
return Promise.all(userApiList.map(url => $.getJSON(url).then(result => {
userData.push(result);
return result;
})));
但重要的是要记住,随着时间的推移,结果将随着请求的完成而不是即时添加。
如果你等待所有这些,Promise.all
将确保他们的顺序与你提出的承诺相同;如果你按照你的方式添加它们,它们可能不是那个顺序(因为你在每个完成时都在推动,而较早的那个可能在后一个完成之后完成)。
答案 1 :(得分:0)
同意上面的回答,
这也可能有用,
return userApiList.map(url => { $.getJSON(url).done(function(results){
userData.push(results)
});})