2014-06-13 67 views
0
$(".room").each(function() { 
    i = i + 1; 
    alert(i); 
    roomid = $(this).attr("id"); 
    alert(roomid); 

    $.get("QueryRoom.aspx?ID=" + roomid, function (data) { 
     $("#" + roomid).html(data); 
    }); 
}); 

}); 

似乎在我的查詢中間roomid沒有更新,並被卡在#22(最後房間ID)。獲取請求執行正常,因爲我可以看到div更改內容。變量不在每個循環更新 - JQuery

任何人都可以幫忙嗎?

+0

在您的第一次獲取請求返回時,您的循環已完成,所以roomid變量代表最後一個數據 –

+0

這是因爲您每次執行該函數時都重新定義了i。 (或更好..讓我成爲默認值,因爲它沒有在函數的新運行時定義)。如果您希望我保持在觸發事件之間,則需要在功能外追蹤它並將其帶入功能。 – Silvertiger

+0

@olly_uk我有這樣的感覺 - 我該如何防止這種情況? –

回答

3

您需要的是一個閉包,以保留roomid的值,直到異步調用完成。創建閉包的一種方法是使用即時函數,在該函數中將roomid的值作爲參數傳遞給它。

有十億篇文章詳細解釋閉包,但簡單地說:閉包是從外部範圍訪問變量的任何函數。在這種情況下創建一個特殊的對象調用閉包,以便保留在內部函數中引用的所有對象/變量的內存位置,從而創建排序的上下文。

在我的例子中,一旦你做了這個閉包,你實際上隱藏了roomid在外部範圍內,因爲你有一個具有完全相同名字的變量的直接函數。因此,您只能訪問直接函數中的值,並且在ajax調用完成時它將具有正確的ID。

$(".room").each(function() { 
     i = i + 1; 
     alert(i); 
     roomid = $(this).attr("id"); 
     alert(roomid); 
     (function(roomid) { 
      $.get("QueryRoom.aspx?ID=" + roomid, function (data) { 
       $("#" + roomid).html(data); 
      }); 
     })(roomid); 
    }); 
}); 
1

roomid被所有的回調函數之間共享$.get。循環執行得足夠快,可以在任何回調完成之前將其完全遞增,以便它們都獲得最大的值。您可以通過多種方式解決這個問題,但最簡單的就是在其當前價值roomid傳遞給了AJAX調用時封閉:

(function (roomid) { 
    $.get("QueryRoom.aspx?ID=" + roomid, function (data) { 
     $("#" + roomid).html(data); 
    }); 
}(roomid)) 

作爲事實上,因爲你不使用varroomid是全球性的。這可能是不受歡迎的。相反,你應該做的:

var roomid = $(this).attr("id"); 

這將爲不會被共享.each功能的每次迭代新roomid - 這使得關閉不必要的。

+0

我做了roomid一個全局變量,它被聲明在代碼片段之外:) –

+0

Works萬分感謝 –