2012-07-18 43 views
1

循環時,我得到這個小麻煩,我總是得到相同的「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); 
    } 
});​ 

UPDATE:對不起,這裏的代碼示例:http://jsfiddle.net/ZgXZB/

+0

嘗試將我複製到另一個變量,然後傳遞該變量來調用。類似於'var j = i;'然後'調用(data,j);' – MrOBrian 2012-07-18 19:26:31

+0

@MrOBrian JavaScript變量具有函數範圍,而不是範圍範圍。 – AlanFoster 2012-07-18 19:27:01

+0

你的意思是你從服務器得到5次相同的答案嗎? – yadutaf 2012-07-18 19:29:23

回答

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); 
     }); 
    }); 
} 

你正在創建你傳遞給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創建一個新閉包。

+0

請看小提琴http://jsfiddle.net/ZgXZB/ – Luis 2012-07-18 19:32:55

+0

小提琴不適合我時我去'運行'它,但我更新了我的代碼基於您的新片段。這是否能解決您的問題? – 2012-07-18 19:36:54

+0

小提琴只是將內容推入控制檯。請檢查它,並且它不適用於你的代碼 - > http://jsfiddle.net/ZgXZB/2/ – Luis 2012-07-18 19:39:35

2

的問題是,你正在試圖讓i回調的價值已恢復,這是您for-loop已完成。你需要做的是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的回調簽名)。

+0

請看JSFiddle http://jsfiddle.net/ZgXZB/ – Luis 2012-07-18 19:32:33

+0

http://jsfiddle.net/2fWc4/ – 2012-07-18 19:35:26