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