推送api对全局变量的响应.map()以某种方式使数据无法访问

时间:2018-05-08 17:55:23

标签: javascript jquery ecmascript-6

我创建了一个函数,通过像这样的

这样的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

2 个答案:

答案 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) });})