在JavaScript中循环内部请求

时间:2015-06-14 06:12:59

标签: javascript jquery for-loop get

所以,我的代码看起来像

for(int n = 0; n < object.length; n++){
  /*Other code */
  $.get(...,function(data){
    //do stuff
  });}

现在,其他代码执行多次,就像它应该的那样。但是,当运行get命令时,它只运行一次,即当n到达object.length时。这会导致各种错误。 n仅在for循环中递增。

你能不能循环获取/发布命令吗?或者,如果可以,做错了什么?感谢。

2 个答案:

答案 0 :(得分:4)

for循环不会等待$.get调用完成,因此您需要在此周围添加一些异步流控制。

结帐async.eachSeries。下面的done回调是控制循环的关键。在每个$.get请求成功/失败后,您调用done();(如果出现错误,请致电done(someErr);)。这将使数组迭代器前进并移动到循环中的下一个项目。

var async = require("async");
var list = ["foo", "bar", "qux"];

async.eachSeries(list, function(item, done) {

  // perform a GET request for each item in the list
  // GET url?somevar=foo
  // GET url?somevar=bar
  // GET url?somevar=qux
  $.get(url, {somevar: item}, function(data) {
    // do stuff, then call done
    done();
  });

}, function(err) {
  if (err) {
    throw err;
  }
  console.log("All requests are done");
});

答案 1 :(得分:1)

您是否希望所有获取请求同时或一个接一个地完成? 您可以使用forEach循环一次完成所有操作。 forEach比普通for循环更好,因为它在每次迭代中为您提供了elemn的新实例。

object.forEach(function(elem, n) {
  /*Other code */
  $.get(...,function(data){
    //do stuff
  });
});

但是如果你想一个接一个地做这些请求,你就可以这样做。

(function loop(n) {
  if(n >= object.length) return;
  /*Other code */
  $.get(...,function(data){
      //do stuff
      loop(n + 1);
    });
})(0);