了解javascript中forEach和for的区别

了解javascript中forEach和for的区别,javascript,ajax,foreach,Javascript,Ajax,Foreach,我正在使用twitch.tv API编写一个应用程序,为此我需要为不同的用户进行多个getJSON()调用。以下输出是否有任何解释 //users array contains the list of users for which data is fetched var users = ["freecodecamp", "brunofin", "storbeck", "medrybw", "comster404", "terakilobyte", "habathcx","RobotCaleb"

我正在使用twitch.tv API编写一个应用程序,为此我需要为不同的用户进行多个getJSON()调用。以下输出是否有任何解释

//users array contains the list of users for which data is fetched
var users = ["freecodecamp", "brunofin", "storbeck", "medrybw", "comster404", "terakilobyte", "habathcx","RobotCaleb","thomasballinger","noobs2ninjas","beohoff"];
使用简单for循环时:

for (var i = 0; i < users.length; i++) {
            var user = users[i];
            $.getJSON("https://api.twitch.tv/kraken/streams/" + user + "?callback=?", function(json) {
                var add = user;
                if(json.status === 422) {
                    add = add + ' ' + "Closed";
                } else {
                    if (json.stream === null) {
                        add = add + ' ' + "Offline";
                    } else {
                        add = add + ' ' + json.stream.game;
                    }
                }
                $("#userList").append("<div>" + add + "</div>");
            });
};
使用forEach时:

users.forEach(function(user) {
            $.getJSON("https://api.twitch.tv/kraken/streams/" + user + "?callback=?", function(json) {
                var add = user;
                if(json.status === 422) {
                    add = add + ' ' + "Closed";
                } else {
                    if (json.stream === null) {
                        add = add + ' ' + "Offline";
                    } else {
                        add = add + ' ' + json.stream.game;
                    }
                }
                $("#userList").append("<div>" + add + "</div>");
            });
});
在forEach的情况下,ajax调用是按顺序进行的,还是有其他操作?

使用
for(var i=0;i
,随后将值0分配到users.length-1到
i
,并对其执行操作,但保持相同的关闭状态

由于js的异步特性,您在收到第一个答案之前发送所有json请求。当您的答案到达时,
user
具有值
users[users.length-1]
,然后在所有输出中使用该值

使用
users.forEach(function(user){…}
,您可以为每个用户元素创建一个新的闭包。在每个闭包中,您有一个本地
user
变量,当json请求的响应发生变化时,您将使用该变量。

使用
for(var i=0;i
,随后,将值0分配给
i
,直到users.length-1,并对其进行处理,但保持相同的闭包

由于js的异步特性,您在收到第一个答案之前发送所有json请求。当您的答案到达时,
user
具有值
users[users.length-1]
,然后在所有输出中使用该值


使用
users.forEach(函数(用户){…}
,为每个用户元素创建一个新的闭包。在每个闭包中,都有一个本地
user
变量,当json请求的响应发生变化时,将使用该变量。

当使用
for
循环进行迭代并在其范围内运行异步代码时,当Ajax第一次返回时,迭代已经结束

使用forEach循环,您为每个迭代运行回调,创建一个新的socpe,即使迭代已经结束,每个函数现在都在事件循环中等待调用

您可以这样做,因此它将是相同的:

for (var i = 0; i < users.length; i++) {
    getUser(user[i]);
};

function getUser(user){
  $.getJSON("https://api.twitch.tv/kraken/streams/" + user + "?callback=?", function(json) {
      var add = user;
      if(json.status === 422) {
          add = add + ' ' + "Closed";
      } else {
          if (json.stream === null) {
              add = add + ' ' + "Offline";
          } else {
              add = add + ' ' + json.stream.game;
          }
      }
      $("#userList").append("<div>" + add + "</div>");
  });
}
for(var i=0;i
理解它的最佳方法是使用setTimeout和print i循环:

for(var i = 0; i < 10; i++){
    setTimeout(function(){ console.log(i) }, 100);
};
for(变量i=0;i<10;i++){
setTimeout(function(){console.log(i)},100);
};
它将输出:10十次,并运行一个函数:

for(var i = 0; i < 10; i++){
    log(i)
};

function log(i){ setTimeout(function(){ console.log(i)}, 100) };
for(变量i=0;i<10;i++){
日志(一)
};
函数日志(i){setTimeout(function(){console.log(i)},100)};

希望有帮助。

当您使用
for
循环并在其范围内运行异步代码时,当Ajax第一次返回时,迭代已经结束

使用forEach循环,您为每个迭代运行回调,创建一个新的socpe,即使迭代已经结束,每个函数现在都在事件循环中等待调用

您可以这样做,因此它将是相同的:

for (var i = 0; i < users.length; i++) {
    getUser(user[i]);
};

function getUser(user){
  $.getJSON("https://api.twitch.tv/kraken/streams/" + user + "?callback=?", function(json) {
      var add = user;
      if(json.status === 422) {
          add = add + ' ' + "Closed";
      } else {
          if (json.stream === null) {
              add = add + ' ' + "Offline";
          } else {
              add = add + ' ' + json.stream.game;
          }
      }
      $("#userList").append("<div>" + add + "</div>");
  });
}
for(var i=0;i
理解它的最佳方法是使用setTimeout和print i循环:

for(var i = 0; i < 10; i++){
    setTimeout(function(){ console.log(i) }, 100);
};
for(变量i=0;i<10;i++){
setTimeout(function(){console.log(i)},100);
};
它将输出:10十次,并运行一个函数:

for(var i = 0; i < 10; i++){
    log(i)
};

function log(i){ setTimeout(function(){ console.log(i)}, 100) };
for(变量i=0;i<10;i++){
日志(一)
};
函数日志(i){setTimeout(function(){console.log(i)},100)};

希望能有所帮助。

(A)同步JAX…您将以网络神允许服务器响应到达您的客户端的任意随机顺序从getjson调用中获得响应。这基本上是一种竞争条件,无法确定它们将以何种顺序到达。您可能会按顺序发出响应,但响应基本上是随机的ered。@MarcB是的,我是在搜索时知道的。但是,为什么所有的用户名都保留在forEach中,而不保留在for中?相关:(A)同步JAX…您将以网络神允许服务器响应到达您的客户端的任意随机顺序从getjson调用中获得响应。这基本上是一种竞争条件,无法确定它们将以何种顺序到达。您可能会按顺序发出响应,但响应基本上是随机的ered。@MarcB是的,我是在搜索时知道的。但是,为什么所有的用户名都保留在forEach中,而不保留在for中?相关: