循环函数不起作用

Loop in function not working

本文关键字:不起作用 函数 循环      更新时间:2023-11-23

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

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/

这是一个比它第一次出现更棘手的问题,也是一个常见的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);
        });
    });
}

您正在传递给 get 的函数回调中对y创建闭包。但是,您只创建了一个闭包,它的最终值为 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

问题是您试图在回调返回(即在 for 循环完成后(获取 i 的值。您需要做的是在首次构造$.get的中间回调时bind要传递给回调i的值:

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 的回调签名(。