1

我在循环时遇到了这个小麻烦,我总是得到相同的“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/

4

2 回答 2

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.

于 2012-07-18T19:31:19.877 回答
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) 的回调签名相匹配。

于 2012-07-18T19:28:05.737 回答