2012-10-28 103 views
1
for (var i = 0; i < 5; i++) { 
    with (x = new XMLHttpRequest()) open("GET","d.php?id=" + i), send(null), onreadystatechange = function() { 
     if (x.readyState == 4 && x.status == 200) alert(i); 
    } 
} 

現在我想每次當readyState = 4,應該提醒的i正確的值,對於這個URL被調用。目前,它僅提醒一次,輸出警報爲5內部呼叫阿賈克斯循環

+3

有趣的語法。以前從未見過'用'這種方式在現實生活中使用。 –

+0

你應該避免因各種原因使用'with'。它會在嚴格模式下拋出一個錯誤。 –

+0

感謝評論傢伙,但我真正的問題是其他一些事情。 –

回答

4

如果你想使用with保留i,你要麼需要將它添加到一個對象,還引用了xhr對象:

for(var i=0;i<5;i++){ 
    with({i:i, xhr:new XMLHttpRequest()}) { 
     xhr.open("GET","d.php?id=" + i); 
     xhr.send(null); 
     xhr.onreadystatechange=function(){ 
      if (xhr.readyState == 4 && xhr.status == 200) 
       alert(i); 
     } 
    } 
} 

或者您需要在with之外創建xhr並將i添加到它。

var xhr; 
for(var i=0;i<5;i++){ 
    (xhr = new XMLHttpRequest()).i = i; 
    with(xhr) { 
     open("GET","d.php?id=" + i); 
     send(null); 
     onreadystatechange=function(){ 
      if (readyState == 4 && status == 200) 
       alert(i); 
     } 
    } 
} 

但是,如果你想有一個適當的,面向未來的解決方案,使在提供所需處理的變量變量範圍的處理程序。

function doRequest(i, xhr) { 
    xhr.open("GET","d.php?id=" + i); 
    xhr.send(null); 
    xhr.onreadystatechange=function(){ 
     if (xhr.readyState == 4 && xhr.status == 200) 
      alert(i); 
    } 
} 

,並調用它是這樣的:

for(var i=0;i<5;i++){ 
    doRequest(i, new XMLHttpRequest()); 
} 

或者,如果你堅持說,內聯函數的一些事,你可以做這樣的:

for(var i=0;i<5;i++){ 
    (function (i, xhr) { 
     xhr.open("GET","d.php?id=" + i); 
     xhr.send(null); 
     xhr.onreadystatechange=function(){ 
      if (xhr.readyState == 4 && xhr.status == 200) 
       alert(i); 
     } 
    }(i, new XMLHttpRequest()); 
} 
+0

嗨,你的答案幫助解決我遇到的問題,但我不知道爲什麼 - 希望你能解釋 - 我最初在我的for循環中擁有所有「doRequest」的代碼,但只有最後一個請求才會通過。我正在循環內創建一個新的請求,就像這個'var request = new XMLHttpRequest()'。一旦我把它分離到另一個函數中並傳遞了所需的變量,它就可以工作了。爲什麼是這樣?以前沒有遇到過這樣的情況。 感謝您的幫助! – sooks

1

這是因爲封閉捕獲了i變量本身,而不僅僅是當前值。我個人做這樣的事情:

for(var i = 0; i < 5; i ++) (function(i) { 
     [..] alert(i) [..] 
})(i); 
+0

這一個不工作,你可以請粘貼確切的代碼, –

1

剛更新James代碼以滿足您的需求

for (var i = 0; i < 5; i++) { 
    with (x = new XMLHttpRequest()) open("GET","d.php?id=" + i), send(null), onreadystatechange = (function(i, x) { 
     return function() { 
     if (x.readyState == 4 && x.status == 200) alert(i); 
     } 
    })(i, x) 
} 

希望這有助於

更新它X,這應該工作

+0

您仍然覆蓋循環中的'x'。 –

+0

它不能正常工作,即使我把x放在循環外 –

+0

'with'在'strict mode'中被棄用 – Trevor

0

這是我sloved它

var x = new Array(); 
for (var i = 0; i < 5; i++) { 
    with (x[i] = new XMLHttpRequest()) open("GET","d.php?id=" + i), send(null), onreadystatechange = (function(i) { 
     return function() { 
     if (x[i].readyState == 4 && x[i].status == 404) alert(i); 
     } 
    })(i) 
} 

,但我更感興趣的使用封解決我的問題,我如何使用closure來解決我的問題。

+0

如果你打算使用閉包,你還可以利用變量作用域, 'with'。我用適當的閉包例子更新了我的答案。 –