循环功能不起作用

时间:2012-07-18 19:20:33

标签: javascript jquery loops for-loop

我在循环时遇到这个小麻烦,我总是得到相同的“y”值(5)并且它不会减少或增加。我想要的是重复ajax调用X次[全部]并通过匿名函数传递响应和当前的电话号码。我希望你能帮助我。

function _shds(long, count, func) {
    for (var y = 0; y < count; y++) {
        gapi.client.load('urlshortener', 'v1', function() {
            var request = gapi.client.urlshortener.url.insert({
                'resource': {
                    'longUrl': long
                }
            });
            var resp = request.execute(function(resp) {
                func(resp.id, y);
            });
        });
    }
}
var total = 3;
var base = "soem";
var lista = ["1", "2", "3", "4", "5"];
_shds("222", total, function(data, y) {
    if (data != "undefined") {
        newbase = base.replace("soem", data);
        console.log(lista[y].uid + newbase + " pos:" + y);
    }
});​

更新:对不起,以下是代码示例:http://jsfiddle.net/ZgXZB/

2 个答案:

答案 0 :(得分:4)

这是一个比第一次出现的更棘手的问题,也是一个常见的JavaScript问题。发生了什么事,当你说:

for (var y = 0; y < count; y++) {
    gapi.client.load('urlshortener', 'v1', function() {
        var request = gapi.client.urlshortener.url.insert({
            'resource': {
                'longUrl': long
            }
        });
        var resp = request.execute(function(resp) {
            func(resp.id, y);
        });
    });
}

您正在传递给y的函数回调中的get上创建一个闭包。但是,您只创建了一个闭包,其最终值为y,即count。你想要做的是创建count个不同的闭包,所以你需要引入一个新的范围:

for (var y = 0; y < count; y++) {
 (function (y){      
  gapi.client.load('urlshortener', 'v1', function() {
      var request = gapi.client.urlshortener.url.insert({
          'resource': {
              'longUrl': longurl
          }
      });
      var resp = request.execute(function(resp) {
          func(resp.id, y);
      });
  });
 })(y);      
}

我相信应该这样做。您需要声明一个新函数来在JavaScript中创建一个新范围,并通过将y作为参数传递给该函数,您将为y的每个值创建一个新的闭包。

答案 1 :(得分:2)

问题是,在返回回调之后,你试图获得i 的值,这是在你的for循环完成之后。当您第一次构建bind的中间回调时,您需要做的是i要传递给回调的$.get的值:

function _short(longurl, count, func) {
    for (var y = 0; y < count; y++) {
        gapi.client.load('urlshortener', 'v1', function() {
            var request = gapi.client.urlshortener.url.insert({
                'resource': {
                    'longUrl': longurl
                }
            });
            var resp = request.execute((function(y, resp) {
                func(resp.id, y);
            }).bind(this, y));
        });
    }
}
var totalchat = 10;
var base = "soem";
var listachat = ["1", "2", "3", "4", "5"];
_short("222", 3, function(data, y) {
    if (data != "undefined") {
        newbase = base.replace("soem", data);
        console.log(listachat[y].uid + newbase + " pos:" + y);
    }
});

bind做的是创建一个新函数,其中this的值绑定到第一个参数(我刚设置为this)并且所有剩余的参数都绑定到函数的第一个参数,而它返回的函数接受一组新的参数(在这种情况下,只有data参数保留原始函数,它与$.get的回调签名匹配。 / p>